C FFmpeg:av_parser_parse2做什么?

C FFmpeg:av_parser_parse2做什么?,c,ffmpeg,h.264,libav,dji-sdk,C,Ffmpeg,H.264,Libav,Dji Sdk,当发送h264数据进行帧解码时,一种常见的方法似乎是首先从libav库对原始数据调用av_parser_parse2 我查找了文档,但除了一些示例代码外,找不到其他任何东西。它是否对数据包进行分组,以便生成的数据以NAL报头开始,从而可以被视为一个帧 以下是使用av_parser_parse2的示例代码的链接: 如果有人能向我解释这些图书馆的详细信息或链接我的资源以便更好地理解,我将不胜感激 谢谢。DJI的视频传输不保证每个数据包中的数据属于单个视频帧。大多数情况下,数据包只包含单个帧所需的部

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

我查找了文档,但除了一些示例代码外,找不到其他任何东西。它是否对数据包进行分组,以便生成的数据以NAL报头开始,从而可以被视为一个帧

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

如果有人能向我解释这些图书馆的详细信息或链接我的资源以便更好地理解,我将不胜感激


谢谢。

DJI的视频传输不保证每个数据包中的数据属于单个视频帧。大多数情况下,数据包只包含单个帧所需的部分数据。它也不能保证一个包包含来自一个帧而不是两个连续帧的数据。 Android的MediaCodec需要排队等候缓冲区,每个缓冲区都保存单个帧的完整数据。 这就是av_parser_parse2()的作用。它收集数据包,直到能够找到足够的数据来支持整个帧。然后将该帧发送到MediaCodec进行解码。

正如您所猜测的,H.264的av_parser_parse2()使用输入数据,查找NAL开始代码0x000001,并检查NAL单元类型,查找帧开始并输出输入数据,但帧不同

也就是说,它消耗输入数据,通过将所有连续数据放入大缓冲区来忽略其帧,然后仅从H.264字节流恢复帧,这是可能的,因为起始代码和NAL单元类型。它不会增加或减少提供给它的数据量。如果你拿出3万,你就投入了3万。但也许你是在1500字节左右的小片段中完成的,这是你收到的网络数据包的有效载荷

顺便说一句,当函数声明没有很好的文档化时,最好查看一下

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


但是,它不会对H.264流的图像数据进行解码。

我没有详细信息,但是当查看未知函数时,查看函数声明通常很有用,可以在此处找到:谢谢。函数头的描述是“解析一个数据包”。我在网上查找术语的解释,但没有结果。另外,需要注意的是,初始原始数据约为8000字节,但经过上述函数后,似乎约为30K字节。我对此感到不解。解析数据包意味着将数据包中包含的数据提取为可在程序中使用的格式。输出会更大是有道理的,因为它本质上是从输入中提取数据,这可能会使它更大,因为它没有那么有效地打包/压缩。我明白了。我想我需要做一些测试来检查包的NAL报头信息在这两种情况下是否保持不变。此外,当我将解析后的数据中继到另一个设备进行ffmpeg编解码器时,结果的延迟比未解析的数据低(未解析的数据导致许多损坏的视频帧)。这种延迟的改善可能吗?字节大小的增加以及解析数据所需的计算是否反而会增加延迟?谢谢。我不确定,但我猜两者之间的数据传输吞吐量很快,而接收端解码效率较低,因此解析后接收更快。谢谢!在计算机上而不是在手机上运行av_parser_parse2会对解码的总体速度产生任何影响吗?现在,这些帧在手机上被解析,并发送到计算机,以便解码成图像帧。但是,我认为通过在计算机(服务器)中接收未解析的数据,并从服务器端运行C脚本中的av_parser_parse2,可以减少延迟。这不会有什么不同吗?PC可能会更快地运行此功能。在我自己的应用程序中,我只需将来自DJI SDK的每个数据包直接发送到PC,然后在那里完成其余的工作。谢谢!说av_parser_parse2()的性能不会改变我是在电话上还是在计算机上运行它,这对吗?我不知道这个函数需要多少计算,但根据描述,计算时间似乎很短。@J.S.是的,它很短。它基本上必须扫描每个字节一次,然后仔细查看一些字节。但是它跳过了大部分,尤其是切片数据,实际编码帧所在的位置。我想知道这一点,因为流式传输解析的h264数据时会增加延迟。我想这可能是因为运行av_parser_parse2()。@J.S。它只有在有完整帧时才输出数据包,因此它必须等待直到收到完整帧。但是如果没有av_parser_parse2(),解码就无法工作,那么就无法避免这种情况。谢谢。我想如果我在电脑上运行它也没关系。我想可以使用并行编程一次解析多个帧来提高速度,但我不太确定。