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
總結
以上是生活随笔為你收集整理的ffmpeg 反复推流_FFmpeg 推流问题记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机答辩ppt演讲稿,毕业答辩PPT演
- 下一篇: 移动网流量用户身份识别系统的源代码_真武