FFmpeg:av_parser_parse2 做什么?

FFmpeg: what does av_parser_parse2 do?

当发送h264数据进行帧解码时,常见的方法似乎是先从原始数据上调用libav库中的av_parser_parse2。

我查找了文档,但除了一些示例代码外,我找不到任何其他内容。它是否对数据包进行分组,以便生成的数据以 NAL headers 开头,以便可以将其视为一个帧?

以下是使用av_parser_parse2的示例代码link:

https://github.com/DJI-Mobile-SDK-Tutorials/Android-VideoStreamDecodingSample/blob/master/android-videostreamdecodingsample/jni/dji_video_jni.c

如果有人能向我解释这些库的详细信息或 link 我的资源以便更好地理解,我将不胜感激。

谢谢。

DJI 的图传不保证每个数据包中的数据属于单个视频帧。大多数情况下,数据包仅包含单个帧所需的部分数据。它也不保证数据包包含来自一个帧而不是两个连续帧的数据。 Android 的 MediaCodec 需要与缓冲区一起排队,每个缓冲区都保存单个帧的完整数据。 这就是 av_parser_parse2() 发挥作用的地方。它会收集数据包,直到它可以找到足够的数据来处理一个完整的帧。然后将此帧发送到 MediaCodec 进行解码。

就像你猜的那样,H.264 的 av_parser_parse2() 消耗输入数据,查找 NAL 起始代码 0x000001 并检查 NAL 单元类型以查找frame 开始并输出输入数据,但具有不同的帧。

也就是说,它消耗输入数据,通过将所有连续数据放入一个大缓冲区来忽略其成帧,然后仅从 H.264 字节流恢复成帧,这是可能的,因为起始码和 NAL单位类型。它不会增加或减少提供给它的数据量。如果你取出 30k,你就已经放入了 30k。但也许你是在大约 1500 字节的小块中完成的,即你收到的网络数据包的有效负载。

顺便说一句,当函数声明没有很好地记录时,最好查看 the implementation

仅仅恢复框架还不足以称之为解析。但是 ffmpeg 中的 H.264 解析器还从 H.264 流中收集了更多信息,例如。是否隔行扫描,果然名副其实

但是它不解码 H.264 流的图像数据。