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