什么是FFmpeg使用avcodec_send_packet()?

问题描述 投票:2回答:1

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

但是,似乎FFmpeg可执行文件能够以大约2倍的速度解码有问题的视频,所以我一直试图弄清楚我们做错了什么。

我写了一个非常剥离的解码器程序用于测试;来源是here(约200行)。从分析中看,解码过程中的一个主要瓶颈似乎是avcodec_send_packet()函数,每次调用可能需要50ms。但是,在FFmpeg中测量相同的调用会显示出奇怪的行为:

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

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

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

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

任何帮助是极大的赞赏。

multithreading performance video ffmpeg avcodec
1个回答
0
投票

avcodec_send_packet()avcodec_receive_frame()是包装函数,最重要的是调用所选编解码器的解码函数并返回解码帧(或错误)。

尝试调整编解码器选项,例如,低延迟可能无法满足您的需求。有时老api(我相信它仍然存在)avcodec_decode_video2()优于新的,你也可以试试。

© www.soinside.com 2019 - 2024. All rights reserved.