Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
H264:使用ffmpeg解码nal单元系列_Ffmpeg_Decode_X264 - Fatal编程技术网

H264:使用ffmpeg解码nal单元系列

H264:使用ffmpeg解码nal单元系列,ffmpeg,decode,x264,Ffmpeg,Decode,X264,我试图用ffmpeg(libavcodec)解码一系列nal单元,但出现了“无帧”错误。我用指南制作了nal单位。我尝试了以下解码策略: avcodec_init(); avcodec_register_all(); AVCodec* pCodec; pCodec=lpavcodec_find_decoder(CODEC_ID_H264); AVCodecContext* pCodecContext; pCodecContext=lpavcodec_alloc_context

我试图用ffmpeg(libavcodec)解码一系列nal单元,但出现了“无帧”错误。我用指南制作了nal单位。我尝试了以下解码策略:

avcodec_init();  
avcodec_register_all();  
AVCodec* pCodec;  
pCodec=lpavcodec_find_decoder(CODEC_ID_H264);  
AVCodecContext* pCodecContext;  
pCodecContext=lpavcodec_alloc_context();  
avcodec_open(pCodecContext,pCodec);  
AVFrame *pFrame;  
pFrame=avcodec_alloc_frame();
//for every nal unit:    
    int frameFinished=0;  
    //nalData2 is nalData without the first 4 bytes
    avcodec_decode_video(pCodecContext,pFrame,&frameFinished,(uint8_t*) nalData2,nalLength);
我将所有单位传递到该代码,但frameFinished保持为0。我想pCodecContext的设置一定有问题。有人能给我一个有效的例子吗


谢谢

查看本教程。它应该能够解码任何视频类型,包括H.264:

我不知道到底是什么导致了这个问题,但我怀疑这与您没有使用libavformat中的
avu read\u frame
一次解析出相当于一帧的数据有关。H.264能够将一帧分割成多个切片,从而分割成多个NAL单元

我非常确定x264编码器在默认情况下不会这样做,而是每帧生成一个NAL单元。然而,存在需要馈送到解码器的具有其他流信息的NAL单元。我在过去曾对此进行过实验,当
av_read_frame
解析出一帧数据时,它有时包含多个NAL单元。我建议大家密切关注本教程,看看是否有效


另一件事是,我认为您确实需要将NAL单元的前4个字节传递到
avcodec\u decode\u video
,如果这是您正在谈论的开始代码(
0x00000001
)。在调查了av read frame的输出后,当发送到解码器时,起始代码仍在数据中。

在编解码器上下文实例化代码后尝试以下操作:

  if(pCodec->capabilities & CODEC_CAP_TRUNCATED)
      pCodecContext->flags |= CODEC_FLAG_TRUNCATED; /* We may send incomplete frames */
  if(pCodec->capabilities & CODEC_FLAG2_CHUNKS)
      pCodecContext->flags2 |= CODEC_FLAG2_CHUNKS;

为了使解码器能够解码视频,您需要向其提供一个流参数集和图片参数集,然后才能正确解码片段/帧。