FFMpeg 中的 AVPacket 和 H.264 NAL Uint 有什么关系?
What's the relationship between AVPacket in FFMpeg and H.264 NAL Uint?
我使用FFMpeg的api将图像编码为H.264流,代码是这样的encode code。当我调用函数 avcodec_encode_video2
时,我得到了一个 AVPacket 的数据,然后我将它保存到文件中。我使用几个图像来获取多个文件进行测试。
根据起始码 00 00 00 01
或 00 00 01
,我发现第一个和第二个文件的数据都包含几个 H.264 NAL Uint。但是从第三个文件开始,找不到startcode。就像下图一样。
我感到很困惑。根据FFMpeg的代码,我认为一个AVPacket的数据应该至少包含一个NAL Uint,但结果出乎意料。这是否意味着一个 NAL Uint 可以分为两个 AVPackets 的数据? AVPacket和H.264 NAL Uint有什么关系?
经过一番测试,我发现这只是我的愚蠢错误。
我在 Qt 中得到了 avpkt 和 setRawData
到 QByteArray,然后将 bytearray 保存到文件中。在保存之前,我调用了 av_packet_unref
来重置 avpkt。我以为 setRawData
会复制 avpkt 的数据,但实际上 QByteArray 只包含数据指针。所以一个AVPacket的数据至少包含一个完整的NAL Uint,是正确的。
00 00 00 01 41.....
........00 00 01 41
....00 00 01 41......
.......
经过我测试,除了初学者,下面的NAL都是用
00 00 01,NAL类型也一样。
所以每个AVPacket至少应该包含一个NAL。
我使用FFMpeg的api将图像编码为H.264流,代码是这样的encode code。当我调用函数 avcodec_encode_video2
时,我得到了一个 AVPacket 的数据,然后我将它保存到文件中。我使用几个图像来获取多个文件进行测试。
根据起始码 00 00 00 01
或 00 00 01
,我发现第一个和第二个文件的数据都包含几个 H.264 NAL Uint。但是从第三个文件开始,找不到startcode。就像下图一样。
我感到很困惑。根据FFMpeg的代码,我认为一个AVPacket的数据应该至少包含一个NAL Uint,但结果出乎意料。这是否意味着一个 NAL Uint 可以分为两个 AVPackets 的数据? AVPacket和H.264 NAL Uint有什么关系?
经过一番测试,我发现这只是我的愚蠢错误。
我在 Qt 中得到了 avpkt 和 setRawData
到 QByteArray,然后将 bytearray 保存到文件中。在保存之前,我调用了 av_packet_unref
来重置 avpkt。我以为 setRawData
会复制 avpkt 的数据,但实际上 QByteArray 只包含数据指针。所以一个AVPacket的数据至少包含一个完整的NAL Uint,是正确的。
00 00 00 01 41.....
........00 00 01 41
....00 00 01 41......
.......
经过我测试,除了初学者,下面的NAL都是用 00 00 01,NAL类型也一样。 所以每个AVPacket至少应该包含一个NAL。