av_read_frame 阻塞卡死解决办法

举报
风吹稻花香 发表于 2021/06/04 23:44:23 2021/06/04
【摘要】 FFmpeg长时间无响应的解决方法 需要解决的问题 1、FFmpeg去连接的时候相机不在线导致avformat_open_input等函数一直死等,造成程序卡死 2、av_read_frame的过程中相机断开连接导致读取码流一直死等 解决方法 打开流媒体...

 

FFmpeg长时间无响应的解决方法

需要解决的问题

 

1、FFmpeg去连接的时候相机不在线导致avformat_open_input等函数一直死等,造成程序卡死

2、av_read_frame的过程中相机断开连接导致读取码流一直死等

解决方法

打开流媒体之前注册FFmpeg回调函数

  1.  
    AVFormatContext *m_pRtspFmt = avformat_alloc_context();
  2.  
     
  3.  
    m_pRtspFmt->interrupt_callback.callback = AVInterruptCallBackFun;
  4.  
    m_pRtspFmt->interrupt_callback.opaque = this;

回调函数类型为:

typedef struct AVIOInterruptCB {int (*callback)(void*);void *opaque;} AVIOInterruptCB;

回调函数中返回1则代表ffmpeg结束阻塞可以将操纵权交给用户线程并返回错误码

回调函数中返回0则代表ffmpeg继续阻塞直到ffmpeg正常工作为止

所以要退出死等则需要返回1

伪代码如下:

  1.  
    //相机连接类
  2.  
    class CIPCamera
  3.  
    {
  4.  
    public:
  5.  
    CIPCamera();
  6.  
    ~CIPCamera();
  7.  
    //AVReadFrame超时回调函数
  8.  
    static int AVInterruptCallBackFun(void *ctx);
  9.  
    //读取rtsp码流线程
  10.  
    static DWORD WINAPI ReadStreamThread(LPVOID param);
  11.  
    //心跳监控线程--监控线程是否死掉
  12.  
    static DWORD WINAPI MonitorThread(LPVOID param);
  13.  
    };
  14.  
     
  15.  
    int CIPCamera::AVInterruptCallBackFun(void *param)
  16.  
    {
  17.  
    CIPCamera *pCamera = (CIPCamera*)param;
  18.  
    if (NULL == pCamera) return 0;
  19.  
     
  20.  
    if (pCamera->m_bQuitFFmpegBlock)
  21.  
    {
  22.  
    //通知FFMpeg可以从阻塞工作线程中释放操作
  23.  
    return 1;
  24.  
    }
  25.  
    else
  26.  
    {
  27.  
    //通知FFMpeg继续阻塞工作
  28.  
    return 0;
  29.  
    }
  30.  
    }
  31.  
    //连接相机 读取rtsp码流线程
  32.  
    DWORD WINAPI CIPCamera::ReadStreamThread(LPVOID param)
  33.  
    {
  34.  
    CIPCamera *pCapture = (CIPCamera*)param;
  35.  
     
  36.  
    if (NULL == pCapture) return -1;
  37.  
     
  38.  
    pCapture->ConnectCamera();
  39.  
    while (pCapture->m_bWorkOK)
  40.  
    {
  41.  
    //FFmpeg读取码流
  42.  
    pCapture->ReadStream();
  43.  
    //发送心跳
  44.  
    pCapture->HeartBeat();
  45.  
    Sleep(1);
  46.  
    }
  47.  
    return TRUE;
  48.  
    }
  49.  
    //监控线程
  50.  
    DWORD WINAPI CIPCamera::MonitorThread(LPVOID param)
  51.  
    {
  52.  
    CIPCamera *pCamera = (CIPCamera*)param;
  53.  
    if (NULL == pCamera) return -1;
  54.  
     
  55.  
    while (pCamera->m_bReWork)
  56.  
    {
  57.  
    //如果心跳超时
  58.  
    if ( OK != pCamera->GetState(&nTimeOut);)
  59.  
    {
  60.  
    //则通知ffmpeg返回
  61.  
    pCamera->m_bWorkOK = FALSE;
  62.  
    pCamera->m_bQuitFFmpegBlock = TRUE;
  63.  
    }
  64.  
    else
  65.  
    {
  66.  
    //ffmpeg继续工作
  67.  
    pCamera->m_bWorkOK = TRUE;
  68.  
    }
  69.  
    Sleep(100);
  70.  
    }
  71.  
     
  72.  
    return 0;
  73.  
    }

 

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/71173220

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。