ffmpeg中的帧级并行解码

ffmpeg中有两种并行解码的模式:帧级别并行和帧内的并行,一般说来,帧级并行是最主要的并行解码模式,本文着重介绍这种模式。

帧级并行解码概念

  所谓帧级并行,就是指在解码时,将时间上相邻的一系列帧同时进行解码,从而充分利用CPU资源,在相同时间解码出更多帧来。从测试看来,目前ffmpeg2.1中使用四个线程同时解码的帧率能达到单线程的2倍以上。

如何进行帧级并行

一、几种帧类型:    

  视频编码主要包含三种帧类型:I、P和B帧。 
  I帧称为帧内编码帧,I帧的解码不需要依赖时间上相邻的其他帧,可以做到独立解码。
  P、B帧为帧间编码帧,需要依赖时间上相邻的已解码帧作为参考,不能独立解码。

图1、 I、P和B帧概念

二、帧级并行解码过程:

  为了阐述简单,这里先假设有两个线程同时解码,更多线程可以以此类推,分两种情况:
  1. 两个线程同时解码两个I帧: 这种情况很简单,两个线程在初始化好参数之后,就可以互不干扰进行解码,直到解码完成。
  2. 第二个线程解码的帧参考了第一个线程的解码帧:这种情况最为常见,是多线程解码需要解决的关键问题。
     P帧在解码一个块时,通过解析码流,可以得到块的运动矢量,运动矢量确定了P帧中当前的块参考到的 I 帧的块的对应位置,如下图2中所示,黑块表示当前P帧正在解码的块,黄色的块表示参考到的I帧中的块。
图2、 P帧参考I帧示意图

     比如一个线程解码图1中的I帧,一个线程解码图1中的P帧,P帧依赖I帧,此时,ffmpeg使用了一种帧级追赶模型
     此时会出现两种情况:(1)I帧中黄色块如果已经解码完成,则P帧的黑色块可以正常解码下去。 (2)I帧中的黄色块还没有解码,此时P帧解码需要挂起(pthread_cond_wait),直到I帧中的黄色块解码完成(pthread_cond_broadcast)。 ffmpeg中使用条件变量来进行挂起和恢复解码操作。ffmpeg将帧级追赶模型简化为了帧级行追赶模型,帧级行追赶模型的步骤为:(1)所有帧解码需要更新解码进度:即解码完一行的最后一个宏块后,假设宏块行相对于图像顶端高度为H, 则更新当前帧的解码进度为H。(2)图2中的P帧黑色块得到MV后计算参考块(I中的黄色块)的高度H0(相对于图像顶端),H0与I的解码进度H比较:H0 < H则解码继续,否则解码挂起;参考帧每更新一次解码进度H,P帧解码线程都会重新比较H0和H, 直到H0 < H, P帧的解码才得以继续进行下去。

     待续......,接下来将结合ffmepg中的代码,来详细说明ffmpeg帧并行解码的代码实现。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
敬告:该系列的课程在抓紧录制更新,敬请大家关注。敬告:本课程项目仅供学习参考,请不要直接商用,概不负责任何法律责任。 该系列的课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,等。包括:音视频、流媒体、直播、Android、视频监控28181、等。 我将带领大家一起来学习使用FFmpeg开发视频监控项目,并动手操练。具体内容包括: 一、视频监控的架构和流程二、FFmpeg4.3+SDL2+Qt5开发环境的搭建三、FFmpeg的SDK编程回顾总结并操练四、SDL2.0的编程回顾总结并操练五、颜色空间转换RGB和YUV的原理与实战六、Qt5+FFmpeg本地摄像头采集预览实战七、代码封装:摄像头h264/5编码并存储八、Qt5+FFmpeg单路网络摄像头采集预览九、Qt5+FFmpeg单路网络摄像头采集预览录制会看十、onvif与GB/T-28181的简介  音视频与流媒体是一门很复杂的技术,涉及的概念、原理、理论非常多,很多初学者不学 基础理论,而是直接做项目,往往会看到c/c++的代码时一头雾水,不知道代码到底是什么意思,这是为什么呢?   因为没有学习音视频和流媒体的基础理论,就比如学习英语,不学习基本单词,而是天天听英语新闻,总也听不懂。 所以呢,一定要认真学习基础理论,然后再学习播放器、转码器、非编、流媒体直播、视频监控、等等。   梅老师从事音视频与流媒体行业18年;曾在永新视博、科大洋、百度、美国Harris广播事业部等公司就职,经验丰富;曾亲手主导广电直播全套项目,精通h.264/h.265/aac,曾亲自参与百度app上的网页播放器等实战产品。  目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。  

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值