ijkplayer异常处理-1

ijkplayer有三个线程,其中第一个也是最重要的线程就是read_thread。

这个线程在某种异常的情况下,会收不到音视频数据,有时候只是视频收不到,有时候都收不到。

所以,需要在回调中增加处理

    
     ic->interrupt_callback.callback = decode_interrupt_cb;
M    ic->interrupt_callback.opaque = ffp;

先read_thread的for循环前初始化变量:

  g_fy_video_cb_lasttime = av_gettime();
#define  FFP_STATE_FANGYAN_REPLAY   25
static int decode_interrupt_cb(void *ctx)
{
      //VideoState *is = ctx;
         FFPlayer *ffp = ctx;
         VideoState *is = ffp->is;
    
    //add start
    if(ffp->blive){  //直播
        int spend_time;
        spend_time = (av_gettime() - g_fy_video_cb_lasttime) / 1000000 ;

        //if interrupt time > 25, replay    
        if(g_fy_video_cb_lasttime && spend_time >= FFP_STATE_FANGYAN_REPLAY){
            if(!is->abort_request){
                is->abort_request = 1;
                ffp_notify_msg2(ffp, FFP_MSG_ERROR, FFP_STATE_FANGYAN_REPLAY);
            }
        }
    }
    //add end.
    return is->abort_request;
}

最后,在读完视频包的地方加上

else if (pkt->stream_index == is->video_stream && pkt_in_play_range
                   && !(is->video_st && (is->video_st->disposition & AV_DISPOSITION_ATTACHED_PIC))) {
            packet_queue_put(&is->videoq, pkt);

    +   if(ffp->blive){
    +       g_fy_video_cb_lasttime = av_gettime();
    +   }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 179,666评论 25 708
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,972评论 18 399
  • 这几天夜里禾苗睡得不是很踏实,要吃好几次奶,并且每次吃奶时间都很长。弄得我很疑惑也头疼。 今天中午回来,妈妈说禾苗...
    Joy_Cheng阅读 455评论 0 0
  • 悬崖边,长着一株花。叶子翠绿,花儿灿烂。 我问花:你独自在这孤独吗? 花儿回答我:我扎根大地母亲,与大自然为 伴,...
    那一日阅读 319评论 0 1
  • 我走在泥泞的雨天路上 累了看看远处吸引我的耀眼闪光 这雾蒙蒙胧胧像是告诉我那是诗一般的美妙佳人 笑着等这雾散...
    愿被沉封阅读 202评论 0 0

友情链接更多精彩内容