ijkplayer异常处理-1

作者: 南风无影 | 来源:发表于2016-12-01 21:24 被阅读145次

    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

        本文链接:https://www.haomeiwen.com/subject/uckfmttx.html