av_read_frame 阻塞卡死解决办法
参考:http://www.mamicode.com/info-detail-561129.html
FFmpeg长时间无响应的解决方法
需要解决的问题
1、FFmpeg去连接的时候相机不在线导致avformat_open_input等函数一直死等,造成程序卡死
2、av_read_frame的过程中相机断开连接导致读取码流一直死等
解决方法
打开流媒体之前注册FFmpeg回调函数
AVFormatContext *m_pRtspFmt = avformat_alloc_context();m_pRtspFmt->interrupt_callback.callback = AVInterruptCallBackFun;m_pRtspFmt->interrupt_callback.opaque = this;
回调函数类型为:
typedef struct AVIOInterruptCB {int (*callback)(void*);void *opaque;} AVIOInterruptCB;
回调函数中返回1则代表ffmpeg结束阻塞可以将操纵权交给用户线程并返回错误码
回调函数中返回0则代表ffmpeg继续阻塞直到ffmpeg正常工作为止
所以要退出死等则需要返回1
伪代码如下:
//相机连接类
class CIPCamera
{
public:CIPCamera();~CIPCamera();//AVReadFrame超时回调函数static int AVInterruptCallBackFun(void *ctx);//读取rtsp码流线程static DWORD WINAPI ReadStreamThread(LPVOID param);//心跳监控线程--监控线程是否死掉static DWORD WINAPI MonitorThread(LPVOID param);
};int CIPCamera::AVInterruptCallBackFun(void *param)
{CIPCamera *pCamera = (CIPCamera*)param;if (NULL == pCamera) return 0;if (pCamera->m_bQuitFFmpegBlock){//通知FFMpeg可以从阻塞工作线程中释放操作return 1;}else{//通知FFMpeg继续阻塞工作return 0;}
}
//连接相机 读取rtsp码流线程
DWORD WINAPI CIPCamera::ReadStreamThread(LPVOID param)
{CIPCamera *pCapture = (CIPCamera*)param;if (NULL == pCapture) return -1;pCapture->ConnectCamera();while (pCapture->m_bWorkOK){//FFmpeg读取码流pCapture->ReadStream();//发送心跳pCapture->HeartBeat();Sleep(1);}return TRUE;
}
//监控线程
DWORD WINAPI CIPCamera::MonitorThread(LPVOID param)
{CIPCamera *pCamera = (CIPCamera*)param;if (NULL == pCamera) return -1;while (pCamera->m_bReWork){//如果心跳超时if ( OK != pCamera->GetState(&nTimeOut);){//则通知ffmpeg返回pCamera->m_bWorkOK = FALSE;pCamera->m_bQuitFFmpegBlock = TRUE;}else{//ffmpeg继续工作pCamera->m_bWorkOK = TRUE;}Sleep(100);}return 0;
}
av_read_frame 阻塞卡死解决办法相关推荐
- linux 卡在grub_详解ubuntu双系统启动时卡死解决办法
ubuntu双系统启动时卡死解决办法(在ubuntu16.04和18.04测试无误) 问题描述: 在安装完ubuntu双系统后,第一次启动ubuntu系统时,卡死在启动界面(或者黑屏),这大概都是由于 ...
- mac双系统装mysql启动不了了_详解ubuntu双系统启动时卡死解决办法
详解ubuntu双系统启动时卡死解决办法 ubuntu双系统启动时卡死解决办法(在ubuntu16.04和18.04测试无误) 问题描述: 在安装完ubuntu双系统后,第一次启动ubuntu系统时, ...
- oracle回退的办法,【案例】Oracle for update回退导致业务阻塞的解决办法
[案例]Oracle for update回退导致业务阻塞的解决办法 时间:2016-11-02 20:53 来源:Oracle研究中心 作者:HTZ 点击: 次 天萃荷净 Oracle研 ...
- 楚留香获取服务器信息卡住了,楚留香手游角色卡住不动怎么办 卡死解决办法...
楚留香手游角色卡住不动怎么办?来看看卡死解决办法.由于手机,网络和服务器等等原因,玩家会出现角色卡住动不了,操作界面消失,无法切换场景等等情况,非常影响游戏体验,来看看怎么解决吧. 楚留香手游角色卡住 ...
- 坦克游戏服务器未响应,《坦克世界》退出战斗 退出战斗卡死解决办法
不知道大家有没有过,在玩坦克世界时,退出战斗会有卡死的情况.小编是没有遇到过.但却看到很多游戏中的朋友反映过.下面小编为大家整理了几个关于退出战斗卡死的情况,以及遇到此情况的玩家的解决办法.希望能给大 ...
- VC6link卡死解决办法
VC6在编译的时候,linking.....,一直就这样link下去,只能在任务管理器中强行退出VC6再重新打开,不过重新打开后问题依旧,实在让人恼火. 网上传说这是VC6的bug,解决vc6卡死的办 ...
- CAD无法正常启动[acadiso.dwt加载卡死]解决办法与问题排除思路分享--以CAD2014版本情况为例
关于CAD启动卡死的解决办法,网上也有不少解决办法,有:处理Internet选项的.处理权限的.怀疑电脑配置低的.....等等!首先排除我的电脑配置.病急乱投医的我逐一尝试了这些方法,发现并不能解决问 ...
- gazebo卡了_ardupilot gazebo打开卡死解决办法
首先这是官网安装gazebo以及搭建模拟环境的教程,里面缺少了配置环境变量的步骤 这里我做一个补充 首先要打开 ~/.bashrc 文件 添加以下内容 source /usr/share/gazebo ...
- Ubuntu装系统后重启卡死解决办法(超详细)
笔者为了装这个Ubuntu可走了不少弯路,想必当你看到我这篇博客时你一定遇到了如下诸多问题的诸多个(笔者全部遇到了): 1.Ubuntu装都装不了,第一步加载lougou下面有几个点,红了几个就停下了 ...
最新文章
- Git学习系列之Git基本操作提交项目(图文详解)
- BZOJ 1406 密码箱(数论)
- 常见虚拟主机目录对照及星外提权目录
- Centos下 ffmpeg 和opencv一起配合处理视频
- java ee500错误_无法访问页面,500错误
- 总结1---CPU之上
- [整理]使用POI操作Excel相关知识~
- 解决 tesserocr 无法安装问题!
- SQL注入漏洞--2
- java数字转为大写_Java 将数字金额转成中文大写
- 进行网络广告策划时需要遵循哪些原则呢?
- 【Linux c】sipc
- 断链在平曲线计算中的处理——短链篇
- 电脑ssd硬盘怎么安装使用
- win10恢复经典开始菜单_Win10 10月更新发布!全新开始菜单来了,这次你敢更新吗...
- python爬网易云_python爬网易云音乐-知了汇智
- 数据的正态分布验证和方差齐性检验
- phpstorm关闭重复代码提示
- 单例模式(Python中的单例类)
- C++ std:string 转 LPWSTR
热门文章
- java实用solr6.6_搜索引擎Solr-6.6.0搭建
- php service原理,轻松搞懂WebService工作原理
- 反编译得到的java文件好多错误 val$query什么意思_这部分代码有错么?一直提示输入框$(#msg).val()得到的值未定义...
- mysql 随机选择数据_从MySQL随机选取数据
- matlab自动重合闸,电力系统自动重合闸matlab仿真 - 图文
- php随机图片github,PHP随机图片代码
- SpringBoot + Redis 解决海量重复提交问题
- 皮一皮:下班的渴望...
- error 1309 mysql_MySQ登录提示ERROR 1045 (28000)错误如何解决
- 【mysql】mysql的数据库主从2(双主双从)