ffmpeg 反复推流_FFmpeg 推流问题记录

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


版权声明:本文为weixin_35275162原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。