首页 > 代码库 > FFmpeg 学习之 定时器解码两路视频并进行对比

FFmpeg 学习之 定时器解码两路视频并进行对比

两路视频跳帧的一些想法:

关于多路视频,如果不涉及对比的话,多线程是最佳选择,来一路视频的话,直接开一个线程去显示处理,非常有效,方便。

但如果说要求两路视频的图像的相似度,那么便牵扯到解码同步问题,如果说一路是本地视频文件,一路是网络视频流,那么很可能由于其帧型的不同,导致解码效率不同,相同序号的帧出现在两个时刻。感觉对比的话,应该是在线程里,当然,鉴于计算量比较大,比较的时候可以再开线程,此为后话。

再说同步的问题,可设置标志位,标定帧号。由于解码本地视频丢帧率较小,且由于帧型而导致解码效率要比网络视频的解码效率要高,故可以将同步开关设置在本地视频解码中。例如帧号,本地视频设置为N1,网络视频设置为N2,两路同时解码,N1 与 N2 自加。后续在N1 < N2 的情况下,N1 解码,也即本地视频解码。这样做有一个前提条件,就是网络视频不丢帧,且解码不丢帧,否则本地视频的解码进度将逐渐滞后于网络视频的解码。

考虑到丢帧的情况,解释说现在要考虑的是:

1、只要是进行了解码,不管成功与否,N2自加,N1解码自加

2、N2 解码成功,即网络视频端解码成功,N2自加,N1的话自加,可能导致N1的进度进度小于N2,即网络视频播放进度在本地视频之前。

综上,不管网络端是否解码成功,本地接口都必须进行解码,两路视频帧号自加运算。


视频解码,本人一直喜欢用定时器,下面谈一些关于定时器在多路视频解码方面的想法:

首先设置三个定时器 T3,前两个做解码用,T1解码本地视频,T2解码网络视频,T3做计算对比。

同多线程解码一样,以本地视频解码为同步控制点,网络端解码,不管成功与否,本地视频在进行解码,两者的帧号均自加。

也就是说只有在 N1<N2 的情况下,本地视频才进行解码。这样便可保持;两路视频解码同步。


再谈对比与运算,这是一个比较麻烦的事情。

如果10帧做一回检测,那么将出现以下两种状况:

1、在两路视频均第20帧解码成功的时候,第10帧已经处理完成。那么这个很简单,无须理会。

2、在两路视频均第20帧解码成功的时候,第10帧没有处理完成,那么情况就复杂了。

如果说只考虑运算数据,那么直接在线程里开辟图片空间,复制图片到临时内存,完成之后释放,结果记录在硬盘文件,这个也简单。

如果说运算数据需要在其他框架里面显示,那么就稍微有点复杂。

思路大概是:开线程,传 this 参数,计算结果显示。

现在来考虑它图片内存的问题:

1、如果运算的时候用到的是原始图片的内存,肯定是不行的,它在逐帧变化之中。

2、在10帧时,开辟内存空间,复制图片,若处理时延在10帧的解码时间之内,简单,直接预算显示。

3、处理时延在10帧解码时延之外,考虑图片空间组,循环赋值到图片空间,数量依据对比处理时延与解码时间而定,这个确实不大好把握。

3、动态分配。需要复制图片空间的时候,开辟内存,然后交给线程去处理,考虑线程同步通信,处理时锁定该资源即可,估计会对效率产生一定影响。

FFmpeg 学习之 定时器解码两路视频并进行对比