JW Player 使用 RTMP 流
阿新 • • 發佈:2019-02-02
譯序: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 上跑的通。
以下 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)。
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 更適合播放器螢幕的當前寬度。
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/。