c++ - Libav多线程解码
问题描述
根据此处的文档,Libav 为多线程解码提供了“基础设施”。但是关于如何实现多线程解码,文档含糊不清。它是内部支持的并且只需要在结构中设置一个标志,还是用户必须提供他自己的实现以及提供的功能?我进行了很多搜索,但甚至找不到一个使用 libav 进行多线程视频解码的示例。
解决方案
您提到的链接看起来像是对编解码器开发人员的描述,而不是使用现有编解码器的 FFmpeg 库的最终用户。
多线程支持确实是由框架本身实现的——它需要 FFmpeg 使用线程支持(如--enable-pthreads
或--enable-w32threads
配置选项)构建,在特定编解码器中有所不同(例如,一个编解码器可能支持多个线程,而其他编解码器不支持)并实现不同的方法(并行解码多个帧或单个帧内的多个切片)。
最终用户应用程序可以配置要使用的线程数(通过AVCodecContext::thread_count
之前设置的属性avcodec_open2()
)和线程模式(AVCodecContext::thread_type
设置为FF_THREAD_FRAME
或FF_THREAD_SLICE
)。线程池将由 FFmpeg 自己管理,尽管一些答案说也可以使用应用程序提供的池。
一些文档提到AVCodecContext::thread_count
默认值设置为0
允许 FFmpeg 自动决定使用多少线程(这将基于系统中的逻辑 CPU 数量来完成),但我从未尝试过(总是手动设置此参数)。因此,它可能已经在您的系统上进行了多线程解码 - 检查任务管理器中的 CPU 负载。
FFmpeg 不做的是管理多个线程以从文件中读取数据包、解码不同线程中的不同流以及视频播放器通常会做的其他类似事情——这通常由应用程序本身实现。虽然我记得一些功能已集成到 FFmpeg 中,从而简化了这些例程的实现(如数据包队列)。
推荐阅读
- c# - MySqlDataReader 没有行但 Query 有数据
- javascript - 无法用玩笑来模拟反应钩子
- html - 同一行的三个 div 之间有多余的空格
- java - Java Spring Sleuth Zipkin - X-Span-Export 未显示
- javascript - Django画布协调过滤的json对象的联合
- python - 如何避免新项目自动链接到主项目?
- c - C 在 fscanf 中使用 char* 导致错误 Segmentation fault: 11
- ios - 在 Swift (iOS) 中单击单元格内的按钮后替换 tableview 单元格
- python - 如何根据for循环中的if子句更改pandas DataFrame中的值
- javascript - Vanilla JS中具有4个值的按钮