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上(开两个线程,使用队列联系起来)
(转载 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上(开两个线程,使用队列联系起来)
相关文章推荐
- insufficient thread locking around avcodec_open/close() 错误提示
- eclipse 无法启动AVD,出现Starting emulator for AVD '' PANIC: Could not open: 错误提示的解决办法
- 【PB】pb打开pbw时提示Attempt to open datawindow failed错误解决办法
- 安装SSL证书后,解决混合内容造成页面错误提示的处理办法
- php错误提示 open_basedir restriction in effect 解决
- Apache启动提示错误undefined symbol: libiconv_open解决方法
- 安装SSL证书后,解决混合内容造成页面错误提示的处理办法
- RT-thread 利用Scons 工具编译提示python编码错误解决办法
- 安装Linux时,“引导分区位于一个GPT分区方案的错误提示”的解决方法
- 解决 Exchange2013提示“出现意外错误,无法处理您的请求”,无法打开OWA和ECP 推荐
- PyQt 如果异常未处理,抛入到事件循环,则无错误提示崩溃的解决方法
- 使用MPMediaPlayerController播放视频提示[NSURL initFileURLWithPath:]: nil string parameter错误的解决办法
- iOS开发之—— XCODE真机调试设备连接一直忙碌如何处理!(真机调试各种错误提示解决)
- 如何解决安装CentOS时遇到引导分区位于一个GPT分区方案的错误提示问题
- php错误提示 open_basedir restriction in effect 解决
- php错误提示 open_basedir restriction in effect 解决
- MySQL错误Forcing close of thread的两种解决方法
- 在git bash中输入git init 提示错误信息: fatal: open /dev/null or dup failed: No such file or directory的解决办法
- startx提示错误:“could not open default font 'fixed'” 的解决方法
- linux上运行程序问题,提示cannot open shared object file错误的解决办法