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