FFMPEG为了提高解码速度,可以使用多线程并发解码,分为线程级并发解码和片级并发编程。并发解码需要解决多帧依赖问题。如同时对I帧和P帧解码,P帧依赖于I帧,怎么办?FFMPEG采用算法如下:
1.每个线程在解码完一行宏块后,更新解码高度H1
2.B/P帧解码宏块时,需要把待解码宏块H2与H1比较,H2>=H1,线程阻塞等待。
3.每个线程更新解码高度是,阻塞线程会被唤醒比较高度。
具体这种多线程机制有没有效果呢?做个分析试验:
实验中,分别设置并发线程 为1,2,4,6,8,10的解码时间。数据统计信息导入EXCEL如下:
折线图分析结果:
从图中可以看出,从线程1到2,4,6解码时间是成倍缩小的,6,8,10再增加线程的话,解码时间就没有明显改进。