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();
    +   }
}

你可能感兴趣的:(ijkplayer异常处理-1)