Libav多线程解码

Libav multi-threaded decoding

根据文档here,Libav 为多线程解码提供了“基础结构”。但是关于如何实现多线程解码,文档含糊不清且令人困惑。它是内部支持的并且只需要在结构中设置一个标志,还是用户必须使用提供的功能提供自己的实现?我搜索了很多,但找不到一个使用 libav 进行多线程视频解码的示例。

您提到的 link 看起来像是针对编解码器开发人员的描述,而不是针对使用现有编解码器的 FFmpeg 库的最终用户的描述。

多线程支持确实由框架本身实现 - 它需要 FFmpeg 构建线程支持(如 --enable-pthreads--enable-w32threads 配置选项),因特定编解码器而异(例如一个编解码器可能支持多线程,而其他线程不支持)并实现不同的方法(并行解码多个帧或单个帧内的多个切片)。

最终用户应用程序可以配置 number of threads to utilize (via AVCodecContext::thread_count property set before avcodec_open2()) and threaded mode (AVCodecContext::thread_type set to FF_THREAD_FRAME or FF_THREAD_SLICE). Thread pool will be managed by FFmpeg itself, although 也可以使用应用程序提供的池。

一些文档提到 AVCodecContext::thread_count 默认值设置为 0 允许 FFmpeg 自动决定使用多少线程(这将根据逻辑 CPUs 的数量来完成在系统中),但我从来没有尝试过这个(总是手动设置这个参数)。所以它可能已经在您的系统上进行了多线程解码 - 检查 CPU 在任务管理器中加载。

FFmpeg 不做的是管理多个线程以从文件中读取数据包、在不同线程中解码不同的流以及视频播放器通常做的其他类似事情——这通常由应用程序本身实现。虽然我记得一些功能已经集成到 FFmpeg 中,简化了这些例程的实现(比如数据包队列)。