您的位置:首页 > 运维架构

insufficient thread locking around avcodec_open/close() 错误提示并解决之道和视频处理方案

2014-01-09 10:21 736 查看
错误的原因

(转载 http://blog.csdn.net/wangchenggggdn/article/details/7591103):
受FFmpeg的libavcodec库的限制,使用如下视频编码器(Video Encoder)进行编码,不能同时进行多个转换任务,否则将导致编码器锁定错误。

具体代码文件是libavcodec/mpegvideo_enc.c,在函数estimate_best_b_count()中,将会调用avcodec_open(),如果一个线程调用了avcodec_open(),但还没有调用avcodec_close(),此时再有一个线程来调用avcodec_open(),就会发生错误,提示"insufficient thread locking around avcodec_open/close()"。

涉及的编码器有:h263, h263+, flv, rv10, rv20, mpeg4, msmpeg4v1, msmpeg4v2, msmpeg4, wmv1。

av_find_stream_info这个函数里面也会调用avcodec_open,所以很有可能两个线程同时调用avcodec_open导致打开失败 。
解决方法:
明显地就是一个线程同步问题。解决的方式就是通过锁。在object-c中有很多种锁(POSIX互斥锁,NSLock类,synchronized,NSRecursiveLock,NSConditionLock);根据我的项目实际需要,我选择了NSRecursiveLock锁,
递归锁避免再次访问的时候死锁。

视频处理方案:

在此还想谈谈客户端处理视频的方案。在理想情况下:接收到一个网络视频数据,马上抛给上层,然后上层解码并显示出来,接着在接收下一个网络视频数据,然后解码并显示。但是一般的arm手机的解码速度是慢于网络的接收速度的。所以这样要处理。我提供三种解决方案:
1.在接收网络视频数据的地方加锁的处理。使接收的网络视频数据满足理想情况,即接收-解码-显示完成后再继续下一帧的接收-解码-显示。
2.接收网络视频数据不加锁,而在解码中加锁处理。这种方案在三种方案中最不好的拉。这种情况丢帧很严重的,如果解码不加锁,就有标题的错误出来。加锁又是加什么样的锁呢?
这个就是我上面谈到的解决方法。
3.接收网络视频数据和解码显示分开两个线程处理。这个应该是最好的方案了。这个方案我在ios上没有实现过,不过最理想的实现方式应该在PC上(开两个线程,使用队列联系起来)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐