一开始我尝试是通过设置ijkplayer的参数去修改延迟,参数的修改能把ijkplayer的开播延迟拉到200ms左右,但是随着播放时间增加延迟也在增加,然后带着问题去网上寻找答案,找到暴走大牙和Gongjia两位大神的解决方案,但是这种方案仅适用于带有音频流的,现在适配的流仅有视频流,用了这两位的方案后,丢帧是可以,但是延迟的问题并没有解决,因为没有音频流的视频的时间基准是用视频流的时间,丢完帧后视频会卡顿等待视频的时间基准。后来我在ijkplayer的issue上找了很多关于卡顿的问题,都没有找到解决方案,后面尝试通过变速的方式去解决这个问题,找到了Mr_xkHuang的一篇ijkplayer-音视频变速播放实现,才了解到了单视频流的视频和有音视频流的视频关于时间基准的差别。修改了时间基准之后,长时直播的延迟问题解决了。
ff_ffplay.c代码修改如下:
static int read_thread(void *arg)
{
.....
if (st_index[AVMEDIA_TYPE_AUDIO] >= 0) {
stream_component_open(ffp,st_index[AVMEDIA_TYPE_AUDIO]);
} else {
//添加新代码
ffp->av_sync_type = AV_SYNC_EXTERNAL_CLOCK;
//注释掉原有代码
// ffp->av_sync_type = AV_SYNC_VIDEO_MASTER;
is->av_sync_type = ffp->av_sync_type;