1)推流结束之后,没有在m3u8文件添加#EXT-X-ENDLIST,导致浏览器播放结束之后,画面中间一直转圈,表示继续加载,没有停止
推流采用的是ffmpeg + flv + rtmp方式
如下是各种无效方案:
1avio_printf(m_oFmtCtx->pb, "#EXT-X-ENDLIST\n");
2不是所有点播m3u8中都有EXT-X-PLAYLIST-TYPE,表明类型。最直接区分就是直播m3u8没有EXT-X-ENDLIST标签,因为是实时流,自然不会有结束,否则就是点播流了。
从上面这段话是否意味着配置有问题? application hls { live on; hls on;
3因为live m3u8文件列表是需要实时更新的,我们做测试的话,可以先在最后面加上#EXT-X-ENDLIST,这个方法经测试有效,但这样已经不是live m3u8模式
原因
这种是直播流方式,根本不可能有结束符的,并且调用的也不正确,因为这种输出是针对文件的,保存为m3u8文件格式,是后台rtmp模块的工作,因此不可行
2)为了生成的m3u8的文件尾添加#EXT-X-ENDLIST,只能调用FFmpeg库将H264码流转换成ts切片,然后生成m3u8文件,这种方案可行
调用接口如下:
std::string strFileIndexName = "index.m3u8";
avformat_alloc_output_context2(&m_oFmtCtx, NULL, "hls", strFileIndexName.c_str());
说明:指定hls作为复用器muxer
3)点播和直播的区别
点播就是将一个媒体文件切割分成多个TS文件,并且m3u8文件保存全部TS文件列表,并且文件结尾包含#EXT-X-ENDLIST
直播则是列表长度上会有所控制,一般会比较短,并且为了减少延时,每一个分片的时长控制低于10秒,因为只有将分片完整下载到本地
才能正常的播放,并且m3u8这个文件根据直播的时间进行实时更新
4)FFmpeg循环推流指令
ffmpeg -threads 2 -re -fflags +genpts -stream_loop -1 -i /mnt/test.mp4 -c:v copy -c:a aac -f flv rtmp://172.2.8.31:1935/live/test2
-re : 表示使用文件的原始帧率进行读取,因为ffmpeg读取视频帧的速度很快,如果不使用这个参数,ffmpeg可以在很短时间就把video.mp4中的视频帧全部读取完并进行推流,这样就无法体现出视频播放的效果了。
ffmpeg -y -re -fflags +genpts -stream_loop -1 -probesize 1280 -i test.mp4 -c copy -f flv rtmp_url, 加-probesize 1280选项后重复播放时不会卡,会比较连贯一些。
5)通过配置hls on将直播服务器配置成实时回放服务器
这种情况下,可以将推送流保存成m3u8格式或者flv格式,如果需要保存成mp4或者其他格式,需要借助FFmpeg等在推流过程中进行转码,目前nginx+rtmp没有这方面的功能
6)提供m3u8回放的网页测试工具,因为使用ffplay工具播放的效果,跟网页播放的效果不一定是一样的,必须实际上测试网页的效果
最初的时候就是因为采用ffplay.exe播放,而没有发现视频结束,出现转圈一直加载的情况
http://tool.liumingye.cn/m3u8/index.php