FFMpeg中的AVPacket和H.264 NAL Uint之间有什么关系?

8
我使用FFMpeg的API将图像编码为H.264流,代码如下(编码代码)。当我调用函数avcodec_encode_video2时,我得到一个AVPacket的数据,然后将其保存到文件中。我使用多张图片进行测试,得到多个文件。
根据起始码00 00 00 0100 00 01,我发现第一个和第二个文件的数据都包含多个H.264 NAL单元。但是从第三个文件开始,我找不到起始码了。就像下面的图片一样。 Picture 我感到困惑。根据FFMpeg的代码,我认为一个AVPacket的数据应该至少包含一个NAL单元,但结果出乎意料。这是否意味着一个NAL单元可能被分成两个AVPacket的数据?AVPacket和H.264 NAL单元之间有什么关系?

你能展示你的代码吗?我怀疑你的编码调用并没有真正返回一个数据包(got_packet_ptr == 0)或者类似的情况。 - Ronald S. Bultje
FFmpeg doxygen中关于avcodec_encode_video2的说明:从帧(frame)中获取输入的原始视频数据,并将下一个输出包(avpkt)写入,如果可用。输出包不一定包含最新帧的数据,因为编码器可以根据需要内部延迟和重新排序输入帧。 所以可能被分割了。您能够将数据连接起来并提供给解码器,看看它是否会出现问题吗? - Dimitri Podborski
@RonaldS.Bultje 我调试了我的程序,got_output 每次都是真的。 - Ello
@incBrain 第三个AVPacket的数据位流有像这样的位 1034 9ab2 047f 0000 a0f7 816e 047f 0000 0000 0000 0000 0000 70c6 5eb2 047f 0000。如果avpkt是正常的,我认为连续的00 00 00应该被编码器替换为00 00 03 00。感觉第三个avpkt是错误的。 - Ello
@incBrain,即使原始帧被编码为延迟或分割,但一个AVPacket至少应包含一个NAL单元。 - androidwifi
显示剩余2条评论
2个回答

2
00 00 00 01 41.....
........00 00 01 41
....00 00 01 41......
.......

经过我的测试,除了初学者之外,以下的NAL都是由00 00 01分隔的,并且NAL类型也相同。 因此每个AVPacket至少应包含一个NAL。


0
经过一些测试,我发现这只是我的愚蠢错误。
我在Qt中得到了avpkt并使用setRawData将其保存为QByteArray,然后将bytearray保存到文件中。在保存之前,我调用了av_packet_unref来重置avpkt。我以为setRawData会复制avpkt的数据,但实际上QByteArray只包含数据指针。因此,一个AVPacket的数据至少包含一个完整的NAL Uint,这是正确的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接