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

错误的原因

(转载 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上(开两个线程,使用队列联系起来)

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值