参考: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 阻塞卡死解决办法相关推荐

  1. linux 卡在grub_详解ubuntu双系统启动时卡死解决办法

    ubuntu双系统启动时卡死解决办法(在ubuntu16.04和18.04测试无误) 问题描述: 在安装完ubuntu双系统后,第一次启动ubuntu系统时,卡死在启动界面(或者黑屏),这大概都是由于 ...

  2. mac双系统装mysql启动不了了_详解ubuntu双系统启动时卡死解决办法

    详解ubuntu双系统启动时卡死解决办法 ubuntu双系统启动时卡死解决办法(在ubuntu16.04和18.04测试无误) 问题描述: 在安装完ubuntu双系统后,第一次启动ubuntu系统时, ...

  3. oracle回退的办法,【案例】Oracle for update回退导致业务阻塞的解决办法

    [案例]Oracle for update回退导致业务阻塞的解决办法 时间:2016-11-02 20:53   来源:Oracle研究中心   作者:HTZ   点击: 次 天萃荷净 Oracle研 ...

  4. 楚留香获取服务器信息卡住了,楚留香手游角色卡住不动怎么办 卡死解决办法...

    楚留香手游角色卡住不动怎么办?来看看卡死解决办法.由于手机,网络和服务器等等原因,玩家会出现角色卡住动不了,操作界面消失,无法切换场景等等情况,非常影响游戏体验,来看看怎么解决吧. 楚留香手游角色卡住 ...

  5. 坦克游戏服务器未响应,《坦克世界》退出战斗 退出战斗卡死解决办法

    不知道大家有没有过,在玩坦克世界时,退出战斗会有卡死的情况.小编是没有遇到过.但却看到很多游戏中的朋友反映过.下面小编为大家整理了几个关于退出战斗卡死的情况,以及遇到此情况的玩家的解决办法.希望能给大 ...

  6. VC6link卡死解决办法

    VC6在编译的时候,linking.....,一直就这样link下去,只能在任务管理器中强行退出VC6再重新打开,不过重新打开后问题依旧,实在让人恼火. 网上传说这是VC6的bug,解决vc6卡死的办 ...

  7. CAD无法正常启动[acadiso.dwt加载卡死]解决办法与问题排除思路分享--以CAD2014版本情况为例

    关于CAD启动卡死的解决办法,网上也有不少解决办法,有:处理Internet选项的.处理权限的.怀疑电脑配置低的.....等等!首先排除我的电脑配置.病急乱投医的我逐一尝试了这些方法,发现并不能解决问 ...

  8. gazebo卡了_ardupilot gazebo打开卡死解决办法

    首先这是官网安装gazebo以及搭建模拟环境的教程,里面缺少了配置环境变量的步骤 这里我做一个补充 首先要打开 ~/.bashrc 文件 添加以下内容 source /usr/share/gazebo ...

  9. Ubuntu装系统后重启卡死解决办法(超详细)

    笔者为了装这个Ubuntu可走了不少弯路,想必当你看到我这篇博客时你一定遇到了如下诸多问题的诸多个(笔者全部遇到了): 1.Ubuntu装都装不了,第一步加载lougou下面有几个点,红了几个就停下了 ...

最新文章

  1. Git学习系列之Git基本操作提交项目(图文详解)
  2. BZOJ 1406 密码箱(数论)
  3. 常见虚拟主机目录对照及星外提权目录
  4. Centos下 ffmpeg 和opencv一起配合处理视频
  5. java ee500错误_无法访问页面,500错误
  6. 总结1---CPU之上
  7. [整理]使用POI操作Excel相关知识~
  8. 解决 tesserocr 无法安装问题!
  9. SQL注入漏洞--2
  10. java数字转为大写_Java 将数字金额转成中文大写
  11. 进行网络广告策划时需要遵循哪些原则呢?
  12. 【Linux c】sipc
  13. 断链在平曲线计算中的处理——短链篇
  14. 电脑ssd硬盘怎么安装使用
  15. win10恢复经典开始菜单_Win10 10月更新发布!全新开始菜单来了,这次你敢更新吗...
  16. python爬网易云_python爬网易云音乐-知了汇智
  17. 数据的正态分布验证和方差齐性检验
  18. phpstorm关闭重复代码提示
  19. 单例模式(Python中的单例类)
  20. C++ std:string 转 LPWSTR

热门文章

  1. java实用solr6.6_搜索引擎Solr-6.6.0搭建
  2. php service原理,轻松搞懂WebService工作原理
  3. 反编译得到的java文件好多错误 val$query什么意思_这部分代码有错么?一直提示输入框$(#msg).val()得到的值未定义...
  4. mysql 随机选择数据_从MySQL随机选取数据
  5. matlab自动重合闸,电力系统自动重合闸matlab仿真 - 图文
  6. php随机图片github,PHP随机图片代码
  7. SpringBoot + Redis 解决海量重复提交问题
  8. 皮一皮:下班的渴望...
  9. error 1309 mysql_MySQ登录提示ERROR 1045 (28000)错误如何解决
  10. 【mysql】mysql的数据库主从2(双主双从)