1. 程式人生 > >JW Player 使用 RTMP 流

JW Player 使用 RTMP 流

        譯序:JW Media Player 是開源的網頁使用的 Flash 播放器。本文采摘於 JW Player 的官方文件,講解了 JW Player 對於 RTMP 的使用方法,我們可以從 JW Player 客戶端的角度來了解 RTMP 協議。以下是官方原文:

        簡介
        RTMP (Real Time Messaging Protocol 實時訊息傳輸協議) 是一個用於將點播和直播媒體交付給 Adobe Flash 應用 (比如 JW Player) 的體系。RTMP 支援 MP4 和 FLV 視訊,AAC 和 MP3 音訊。RTMP 相對於一般的 HTTP 視訊下載 (很多網站使用這種方式進行線上視訊播放) 具有以下優勢:
  • RTMP 可以進行視訊直播
    ,人們可以在你錄製的同時觀看視訊。
  • RTMP 可以做動態流,播放視訊的質量可以根據頻寬而自動變化。
  • 播放器可以快進到視訊的後面部分,這對於大於十分鐘的視訊很有用 (這一點是 HTTP 下載方式的線上視訊無法匹敵的)。
  • 播放器維護有一個小小的緩衝,避免了視訊回放時的重新下載,節省了頻寬。
        缺點
        但是,請注意 RTMP 也有自身的缺點,最重要的幾個是:
  • RTMP 使用了跟 HTTP 不同的協議和埠號,這使得它很容易遭受 (公司) 防火牆的封堵。可以使用 RTMPT (通過 HTTP 通道) 避免這個問題,但這需要伺服器付出一定的效能代價。
  • RTMP 資料被流化後傳給播放器,這意味著連線的頻寬必須要比視訊的資料速率大。如果連線中止了幾秒,流將卡住。這個問題在很大問題上可以使用包含一個低質量檔案的動態
    流來進行預防。

        最大的缺點是 RTMP 只能工作在 Flash 而不能工作在 HTML5。新的 HTTP 流協議,比如蘋果的 HTTP Live Streaming (HLS),具有更廣泛的裝置支援 (比如 iOS),在未來的幾年內很可能會取代 RTMP。JW Player 在 Flash 和 HTML5 模式下都能夠支援蘋果 HLS

        伺服器支援
        要使用 RTMP,你的主機或者 CDN 需要安裝一個專用 RTMP 伺服器。這裡有兩個主流產品,JW Player 都支援:
  • Wowza Media Server 是當前最廣泛採用的解決方案。它包含了支援幾乎所有的流媒體協議,包括 RTMP。Wowza 3 引入了對 JW6 SMIL manifest 的專用支援 (看下文)。
  • Adobe Media Server 是另外一個很好地選擇。因為 Flash 是由 Adobe 開發的,RTMP 的新功能首先會在 FMS 上跑的通。
        CDNS
        以下 CDN (Content Delivery Networks 內容分發網路) 能夠支援 RTMP,並且使用 JW Player 測試效果良好。它們都支援動態流,除了 CloudFront,也都支援現場直播
        現場直播
        RTMP 的一個關鍵的特徵就是能夠進行現場直播,比如展示會,音樂會或者體育賽事。在 JW Player 和一臺 RTMP 伺服器之後,你還需要一個小工具來將直播視訊提取給伺服器。有很多這樣的工具可供選擇。Flash Live Media Encoder 就是這樣的一個免費的,可以用於 Windows 和 Mac 的工具。
        對於 FMS 和 Wowza,嵌入直播流的方式和嵌入點播的方式一樣。但是,對於 Akamai、Edgecast 和 Limelight 等 CDN 要求播放器訂閱到直播流。JW Player 6支援這種機制
        JW Player 6 將會像嵌入一個點播檔案一樣嵌入一個直播流,但有個例外:取代顯示在時間軸上的滑塊 (直播嘛) 的是播放器在控制條上顯示時間的標題。
        負載均衡
        對於大規模的部署,JW Player 為支援伺服器的負載均衡提供了三個機制:
  • DNS 負載均衡,獨立於 JW Player。
  • RTMP 302 重定向,被 Wowza 用於負載均衡。更多資訊參考他們的使用者指南。
  • SMIL 負載均衡,包含 RTMP 連結到邊緣節點的一個初始化 SMIL 檔案。可以參見下面關於 SMIL 檔案動態流的例子。
        隱藏字幕
        JW Player 支援 RTMP 直播和點播的字幕隱藏。只支援一個單一的 CC 軌道,而且這個軌道必須是 TX3G 格式的。Wowza 和 Adobe media server 都有能力使用 RTMP 傳送 TX3G 字幕。

        JW Player 第一次遭遇一個文字提示的 TX3G 時,它在控制條中放置了一個 CC 按鈕。如果使用者選擇啟用 CC,這一偏好會被儲存在 cookie,使用者以後觀看任何視訊時 CC 都會是啟用狀態。

        嵌入一個流
        嵌入一個 RTMP 流到 JW Player 6 只是簡單提供一個完整流 URL 的問題。這裡是一個很基本的例子,播放一個 MP4 視訊:
jwplayer("myElement").setup({
    file: "rtmp://example.com/application/mp4:myVideo.mp4",
    image: "/assets/myVideo.jpg",
    height: 360,
    width: 640
});


        以上例子僅僅工作在桌面上,因為 Flash 在移動終端不可用。下面是另一個例子,使用 RTMP 和 HTTP 載入的一個 MP4。RTMP 流將會在桌面播放,下載的 HTTP 將會在移動終端播放:
jwplayer("myElement").setup({
    playlist: [{
        image: "/assets/myVideo.jpg",
        sources: [{ 
            file: "rtmp://example.com/application/mp4:myVideo.mp4"
        },{
            file: "/assets/myVideo.mp4"
        }]
    }],
    height: 360,
    primary: "flash",
    width: 640
});


        因為主要呈現模式設定為 Flash,RTMP 流被選中。如果這一選項沒有設定,JW Player 將會播放 HTTP 下載,因為很多瀏覽器 (比如 Chrome、IE)在 HTML5 中支援那個 (JW6 中的預設模式)。
        參見 Working with Playlists 以獲取關於載入多路源的更多資訊。
        應用和流
        技術上講,一個 RTMP 流包含兩塊:
  • 應用路徑 (例如rtmp://example.com/vod/)。
  • 標識 (例如mp4:myFolder/video.mp4)。
        JW Player 6 中,這兩塊被整合到單個 URL。JW Player 根據 mp4flv 或者 mp3 字首的位置來決定應用和流之間的分割。
        1. MP4/M4V/MOV/F4V 視訊需要一個 mp4: 字首:
rtmp://example.com/vod/mp4:myFolder/myVideo.mp4

        2. FLV 視訊或者一個直播流 (FLV 容器下的) 需要一個 flv: 字首:
rtmp://example.com/vod/flv:myFolder/myVideo.flv
rtmp://example.com/live/flv:myFolder/myLiveStream

        3. MP3 音訊需要一個 mp3: 字首:
rtmp://example.com/vod/mp3:myFolder/mySong.mp3

        4. M4A/F4A/AAC 音訊檔案也需要一個 mp4: 字首:
rtmp://example.com/vod/mp4:myFolder/mySong.m4a

        如果沒有找到任何字首,player 在檔名最後一個 / 之後對應用和流進行分割。字首隨後被自動新增 (mp4:, mp3:)。注意flv 字首並不被 Wowza/Adobe 伺服器內部使用,因此 JW Player 將在請求流之前將其剝離。

        動態流
        除了載入單一 RTMP 流之外,JW Player 6 支援載入動態流。一個動態流包含多個具有同一內容的單流,它們具有不同的品質。JW Player 允許在這樣一個流中進行不同品質的自動或者手工切換。
        動態流必須使用叫做 SMIL manifest 設定。這是一些包含有 RTMP 應用路徑加上存放在 RTMP 伺服器上的流的路徑的簡單的 XML 檔案。播放器經常假定一個帶有.smil 字尾的檔案是一個 RTMP SMIL manifest:
jwplayer("myElement").setup({
    file: "/assets/myVideo.smil",
    image: "/assets/myVideo.jpg",
    height: 360,
    width: 640
});

        這是另一個例子,使用了一個 RTMP 動態流 (為桌面) 和一個漸進 MP4 下載 (為移動終端):
jwplayer("myElement").setup({
    playlist: [{
        image: "/assets/myVideo.jpg",
        sources: [{ 
            file: "/assets/myVideo.smil" 
        },{
            file: "/assets/myVideo.mp4" 
        }]
    }],
    height: 360,
    primary: "flash",
    width: 640
});

        注意 SMIL manifest 是 跨域安全限制 的主題。如果你的 SMIL 檔案位於你的網站或播放器之外的另一臺伺服器上,你需要去設定一個 crossdomain.xml 檔案。
        SMIL 內容
        這是一個基本的例子,使用了三個不同的流:
<smil>
  <head>
    <meta base="rtmp://example.com/vod/" />
  </head>
  <body>
    <switch>
      <video src="myVideo-high.mp4" height="720" system-bitrate="2000000" width="1280" />
      <video src="myVideo-medium.mp4" height="360" system-bitrate="800000" width="640" />
      <video src="myVideo-low.mp4" height="180" system-bitrate="300000" width="320" />
    </switch>
  </body>
</smil>

        品質的切換由 JW Player 自動完成,它將選用最高品質:
  • 誰的 system-bitrate 更適合連線的當前頻寬。
  • 誰的 width 更適合播放器螢幕的當前寬度。
        使用者可以通過設定快捷選單中的品質對這些自動選項進行重寫。manifest 中的 關於流的 height 屬性用於設定選單的標籤 (例如 720p)。
        WOWZA 3
        Wowza Media Server 3 為這些 SMIL manifest 引入了專門的支援。如果你在執行 3.1.2.15 或更高版本的 Wowza,在你適配的流的 URL 後面新增/jwplayer.smil 來得到這些 manifest。
        這裡是 Wowza3 中 SMIL manifest 和 M3U8 manifest 的 URL 的樣子:
http://example.com/vod/smil:myvideo.smil/jwplayer.smil
http://example.com/vod/smil:myvideo.smil/manifest.m3u8
        配置選項
        RTMP 提供了一些配置選項來對流的播放進行調整。它們設定在一個專用的 rtmp 選項塊中。
        緩衝長度
        在預設情況下,JW Player 試著為 RTMP 視訊維護一個長度為 3 秒的緩衝。這意味著有三秒鐘的視訊被從伺服器端獲取並隨時可以播放。這個長度可以使用 RTMPbufferlength 選項進行修改:
jwplayer("myElement").setup({
    file: "rtmp://example.com/vod/mp4:myVideo.mp4",
    height: 360,
    image: "/assets/myVideo.jpg",
    rtmp: {
        bufferlength: 0.1
    },
    width: 640
});

        可用值的範圍是從 0.1 (對於低延時的直播) 到 10 (為防止頻繁的重緩衝)。
        FC 訂閱
        當使用 Akamai、Edgecast 或者 Limelight 等 CDN 分發直播流時,播放器不能簡簡單單地連線到直播流。播放器需要通過傳送一個叫做FC Subscribe 的呼叫到伺服器進行訂閱。JW Player 包含了對此的支援,使用 RTMPsubscribe 選項:
jwplayer("myElement").setup({
    file: "rtmp://example.com/xxxx/myStream",
    height: 360,
    image: "/assets/myLivestream.jpg",
    rtmp: {
        subscribe: true
    },
    width: 640
});

        注意這一個功能僅適用於單一 RTMP 流。對於多位率的直播流,應該使用 HLS 協議。
        安全令牌
        Wowza Media Server 具有一個叫做安全令牌 (參考 《使用安全令牌保護 RTMP 流》) 的特性,用於保護你的流被下載。它通過播放器傳送給伺服器一個令牌,然後伺服器在開始傳送流之前對令牌驗證進行工作。JW Player 通過使用 RTMPsecuretoken 選項支援這一機制:
jwplayer("myElement").setup({
    file: "rtmp://example.com/vod/mp4:myVideo.mp4",
    height: 360,
    image: "/assets/myVideo.jpg",
    rtmp: {
        securetoken: "Kosif093n203a"
    },
    width: 640
});

        注意我們不支援編譯安全令牌的選項。SWF 通過提供了對 JS (它們都是客戶端) 的安全增強,尤其是當 JS 程式碼有點混亂時。
原文連結:http://www.longtailvideo.com/support/jw-player/28854/using-rtmp-streaming/