看来问题只能这样解决了,现在还要多测测,防止产生新的问题。目前来看,对现有代码没有影响,花屏的帧直接屏蔽掉了。
思路:
问了下机顶盒方面h264解码的,他们用的是硬件解码,他们做到不花屏的方法就是简单的设置了一个硬件解码提供的接口:设置了错误处理模式。
我想这个错误处理模式肯定对那些错误的帧直接屏蔽掉了,这样显示到屏幕上就不花了。
因此,就有了问题:ffmpeg有没有错误处理的模式,能使花屏的帧(h264格式的)不显示出来?
查了些资料,没找到。
PS:各位如果知道的话,请留个言。
我假定ffmpeg没有这个模式,十有八九没有。我就用我的方法模拟一个错误处理模式。
在AVFrame(FF_COMMON_FRAME)里添加一个变量,datadamage.
这个变量为0时,表示这个frame没有错误;反之,为1时,表示有错误。
怎么用呢?
当av_decode_video()解出一帧后,判断这个标志:
为1。就不渲染,屏蔽掉。如果当前帧是关键帧,且标志为1,到下一个关键帧之前的所有帧都屏蔽掉。
为0就正常渲染。
现在的问题就变成了这个标志什么时候置的问题。
首先我们要知道一个frame(h264)什么时候开始解码的.知道了什么时候开始,也就知道了什么时候结束。(下一帧开始解码的时候,上一帧当然结束了)。
这里有个依据,current_mb_slice == 0时,表示一帧开始。
当然也可以用第2个方法:ff_h264_frame_start()这就是一帧开始了。
那么我们怎么判断这帧错误呢?
我用的方法是:
因为h264一帧由slice MB这些单位,当解这帧的任意slice或任意MB出现错误时,只要有一个错误,这帧就置错误标志。
另h264每帧之前还有些相应信息,SPS PPS.这些出现错误的话,理论上应该到下一个SPS或PPS之间的帧都要置错误标志,这个还没做(目前没什么影响)。再后面几天测试的时候可能要仔细考虑下。
上面就是目前的方案,也是想到唯一的方案,目前为止能屏蔽掉花屏的帧。
等到完全测试成功,再说吧。
这个方案中有什么好的建议的,请大家提出来。不胜感激