在SkeyeExPlayer的开发过程中,经测试发现ffmpeg的读取网络流以及网络数据的接口都有较大概率出现阻塞的问题,ffmpeg也提供了设置阻塞回调或者设置超时等方式来跳出阻塞而不会导致接口永久卡住;而在某些时候,比如,网络断开时间过长的时候,这个时候阻塞回调将不在有用而且阻塞的接口也不再返回数据,出现"永久性"假死的情况,针对这些问题,本文将对其处理方式进行一一讲解。
1.播放器结束时接口导致线程卡住
针对该问题,我们通常可以在ffmpeg的阻塞回调函数中设置退出标志来解决,如下代码所示:
//播放器退出状态标志,解除阻塞
if(pPlayer->player_status & PS_CLOSE)
{
return AVERROR_EOF;
}
2.播放器因为接口卡住而出现断线
这个问题也就是我们通常情况下所说的断线重连的处理,断线重来你分两步走,第一步,判断出现断线的时机;第二布,断线进行重连的处理;
第一步,通常认定读取的网络流数据丢失一定的时间为断线,阻塞回调函数处理如下:
int64_t curTime = av_gettime();
//5s超时退出
if ((curTime - pPlayer->cur_read_time) > pPlayer->reconnect_time * 1000 * 1000)//5秒一次的重连
{
pPlayer->error_flag = 1;
char sErrorInfo[100] = { 0, };
sprintf(sErrorInfo, "interrupt_cb() enter,流已断开,正在尝试重连....