HTTP-FLV直播初探

目前幾種視頻流的簡單對比:html

協議html5

httpflvios

rtmpgit

hlsgithub

dashweb

傳輸方式瀏覽器

http流服務器

tcp流微信

httptcp

http

視頻封裝格式

flv

flv tag

Ts文件

Mp4 3gp webm

延時

數據分段

連續流

連續流

切片文件

切片文件

Html5播放

可經過html5解封包播放(flv.js)

不支持

可經過html5解封包播放(hls.js)

若是dash文件列表是mp4webm文件,可直接播放

 

  • RTMP(Real Time Messaging Protocol)是基於TCP的,由Adobe公司爲Flash播放器和服務器之間音頻、視頻傳輸開發的開放協議。

  • HLS(HTTP Live Streaming)是基於HTTP的,是Apple公司開放的音視頻傳輸協議。

  • HTTP FLV則是將RTMP封裝在HTTP協議之上的,能夠更好的穿透防火牆等。

 

  

 

Http_flv & RTMP

這兩個協議實際上傳輸數據是同樣的,數據都是flv文件的tag。http_flv是一個無限大的http流的文件,相比rtmp就只能直播,而rtmp還能夠推流和更多的操做。可是http有個好處,就是是以80http通訊的,穿透性強,並且rtmp是非開放協議。

這兩個協議是現在直播平臺主選的直播方式,主要緣由就是延時極低。

將測試:RTMP延遲1s左右,HTTPFLV延遲1-2s左右,可用於對延遲要求比較苛刻的場景,但要注意兼容性,文章最後會說明HTTPFLV兼容性。


 

 

HTTP FLV直播Demo:

<!DOCTYPE html>
<html>

<head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
    <title>flv.js demo</title>

    <style>
        .mainContainer {
            display: block;
            width: 1024px;
            margin-left: auto;
            margin-right: auto;
        }

        .urlInput {
            display: block;
            width: 100%;
            margin-left: auto;
            margin-right: auto;
            margin-top: 8px;
            margin-bottom: 8px;
        }

        .centeredVideo {
            display: block;
            width: 100%;
            height: 576px;
            margin-left: auto;
            margin-right: auto;
            margin-bottom: auto;
        }

        .controls {
            display: block;
            width: 100%;
            text-align: left;
            margin-left: auto;
            margin-right: auto;
            margin-top: 8px;
            margin-bottom: 10px;
        }

        .logcatBox {
            border-color: #CCCCCC;
            font-size: 11px;
            font-family: Menlo, Consolas, monospace;
            display: block;
            width: 100%;
            text-align: left;
            margin-left: auto;
            margin-right: auto;
        }
    </style>
</head>

<body>
    
    <div class="mainContainer">
        <video name="videoElement" class="centeredVideo" id="videoElement" controls width="1024" height="576" autoplay>
            Your browser is too old which doesn't support HTML5 video.
        </video>

    </div>

    <script src="./flv.js?v=2"></script>
    
    <script>
         if (flvjs.isSupported()) {
            startVideo()
        }

        function startVideo(){
            var videoElement = document.getElementById('videoElement');
            var flvPlayer = flvjs.createPlayer({
                type: 'flv',
                isLive: true,
                hasAudio: true,
                hasVideo: true,
                enableStashBuffer: true,
                url: 'https://xl.live-play.acgvideo.com/live-xl/520658/live_12860646_332_c521e483.flv?wsSecret=778d91efcb22c588be28cb67ebe57082&wsTime=1510929009'
            });
            flvPlayer.attachMediaElement(videoElement);
            flvPlayer.load();
            flvPlayer.play();
        }

        videoElement.addEventListener('click', function(){
            alert( '是否支持點播視頻:' + flvjs.getFeatureList().mseFlvPlayback + ' 是否支持httpflv直播流:' + flvjs.getFeatureList().mseLiveFlvPlayback )
        })

        function destoryVideo(){
            flvPlayer.pause();
            flvPlayer.unload();
            flvPlayer.detachMediaElement();
            flvPlayer.destroy();
            flvPlayer = null;
        }

        function reloadVideo(){
            destoryVideo()
            startVideo()
        }
    </script>
    
</body>

</html>

 

flv.js問題:(暫時發現這幾個)

1. 播放一段時間後,音視頻不一樣步

2. 播放一段時間後,音頻模糊

3. 暫停後繼續播放是接着暫停時的場景繼續播,對於直播會產生延遲 =》 臨時解決方案:暫停後繼續播放時,手動銷燬視頻再從新加載播放

4. 手機端兼容性差

 --------------------------------------------

1,2 問題解決方案:

嘗試設置 config.fixAudioTimestampGap = false

控制檯將不會輸出大量警告信息。

經檢測,不一樣的推流客戶端,會致使音視頻同步問題有不同的體現。

LFLiveKit 的音頻流時間戳問題,按期會有兩幀之間存在兩倍時間戳差,會致使嚴重音畫不一樣步。

目前在咱們平臺,ios客戶端音視頻均同步,安卓客戶端音視頻不一樣步,須要設置flvjs的config.fixAudioTimestampGap = false纔會音視頻同步。

github issue:https://github.com/Bilibili/flv.js/issues/136

----------------------------------------------

判斷flv.js在手機端是否支持點播和httpflv直播:

是否支持點播視頻:flvjs.getFeatureList().mseFlvPlayback

是否支持httpflv直播流:flvjs.getFeatureList().mseLiveFlvPlayback 

目前測試結果:

ios :均不支持,包括微信和safari

安卓:微信均不支持;其餘瀏覽器部分支持點播,所有不支持直播

 

完整版demo:https://github.com/saysmy/http-flv

 

--------------------------------------------

2019-01-05更新

通過多天的測試,對數十位主播分別用flvjs的master分支、#136#354進行10分鐘到2小時的測試,總結一下結論:

1. master分支、issue 136 都會出現不一樣程度主播音畫不一樣步的狀況,master分支音畫不一樣步狀況尤爲嚴重。

2. #354 pr 能夠正常播放全部主播的音視頻,均同步。

3. 騰訊雲TCPlayerLite和Web 直播播放器 1.0均使用flvjs庫進行以html5方式播放flv(猜想使用master分支),經測試也是出現大面積音畫不一樣步現象。

結論:

若是想在pc上使用flvjs播放flv格式直播,請選用 flvjs的PR#354

也期待flvjs做者能夠儘早確認此PR併合併到master,造福全人類!

相關文章
相關標籤/搜索