Multithreading 什么';s FFmpeg使用avcodec_send_packet()做什么?

Multithreading 什么';s FFmpeg使用avcodec_send_packet()做什么?,multithreading,performance,video,ffmpeg,avcodec,Multithreading,Performance,Video,Ffmpeg,Avcodec,我正在尝试优化一个用于播放视频的软件,它在内部使用FFmpeg库进行解码。我们发现,在一些大型(4K,60fps)视频中,解码一帧所需的时间有时比显示该帧所需的时间更长;遗憾的是,由于问题域的存在,简单地缓冲/跳过帧不是一个选项 然而,FFmpeg可执行文件似乎能够以大约2倍的速度对所讨论的视频进行解码,所以我一直在努力找出我们做错了什么 我已经编写了一个非常精简的解码器程序进行测试;来源是(大约200行)。从分析中可以看出,解码过程中的一个主要瓶颈是avcodec\u send\u packe

我正在尝试优化一个用于播放视频的软件,它在内部使用FFmpeg库进行解码。我们发现,在一些大型(4K,60fps)视频中,解码一帧所需的时间有时比显示该帧所需的时间更长;遗憾的是,由于问题域的存在,简单地缓冲/跳过帧不是一个选项

然而,FFmpeg可执行文件似乎能够以大约2倍的速度对所讨论的视频进行解码,所以我一直在努力找出我们做错了什么

我已经编写了一个非常精简的解码器程序进行测试;来源是(大约200行)。从分析中可以看出,解码过程中的一个主要瓶颈是
avcodec\u send\u packet()
函数,每次调用最多需要50ms。但是,在FFmpeg中测量同一调用会显示出奇怪的行为:

(这些是解码4K 25fps VP9编码视频时,每次调用avcodec_send_packet()所花费的时间(以毫秒为单位)

基本上,当FFmpeg使用此函数时,完成每N个调用实际上只需要花费任何时间,其中N是用于解码的线程数。然而,我的测试解码器和实际产品都使用4个线程进行解码,而这并没有发生;使用基于帧的线程时,测试解码器的行为类似于仅使用1个线程的FFmpeg。这似乎表明我们根本没有使用多线程,但我们仍然看到通过使用更多线程来提高性能

FFmpeg的结果平均是我们解码器的两倍,所以很明显我们做错了什么。我一直在阅读FFmpeg的源代码,试图找到任何线索,但到目前为止我还没有找到

我的问题是:FFmpeg在这里做了什么而我们没有做?或者,我们如何提高解码器的性能

非常感谢您的帮助。

avcodec\u send\u packet()
avcodec\u receive\u frame()
是包装函数,它们所做的最重要的事情是调用所选编解码器的解码函数并返回解码帧(或错误)


尝试调整编解码器选项,例如,低延迟可能无法满足您的需要。有时候旧的api(我相信它仍然存在)
avcodec\u decode\u video2()
比新的要好,你也可以试试。

源代码链接断了。