c - FFmpeg:av_parser_parse2 做什么?

标签 c ffmpeg h.264 libav dji-sdk

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

我寻找文档,但除了一些示例代码之外我找不到任何东西。它是否对数据包进行分组,以便生成的数据以 NAL header 开始,以便可以将其视为帧?

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

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

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

谢谢。

最佳答案

正如您所猜测的,H.264 的 av_parser_parse2() 消耗输入数据,查找 NAL 起始代码 0x000001 并检查 NAL 单元类型,查找帧起始并输出输入数据,但是具有不同的框架。

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

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

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

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

关于c - FFmpeg:av_parser_parse2 做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50992787/

相关文章:

Contiki Cooja 错误 "Executing MSP430X instruction but MCU is not a MSP430X"

使用 strncpy 复制字符串会导致输出中出现垃圾值

c - 如何找到屏障功能的实现?

ffmpeg - Libav转码为H264 : Frames being dropped

android - 如何在 Android 中使用 MediaCodec Api 通过 RTP 解码 H264

c - 求 k 簇中集合划分的最小平方和

parsing - flac 和 wav 的 ffmpeg 输出不同,为什么?

encryption - 使用 ffmpeg 解密碎片化的 mpeg-dash

video - 使用 ffmpeg 连接视频并在它们之间添加黑帧

python - 如何将 H264 RTP 流从 PCAP 转换为可播放的视频文件