使用 JW Player 播放RTMP 流

jopen 10年前發布 | 405K 次閱讀 JW Player 流媒體服務器

    譯序: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 下載方式的在線視頻無法匹敵的)。
  • 播放器維護有一個小小的緩沖,避免了視頻回放時的重新下載,節省了帶寬。
  • </ul>         缺點
            但是,請注意 RTMP 也有自身的缺點,最重要的幾個是:

    • RTMP 使用了跟 HTTP 不同的協議和端口號,這使得它很容易遭受 (公司) 防火墻的封堵。可以使用 RTMPT (通過 HTTP 通道) 避免這個問題,但這需要服務器付出一定的性能代價。
    • RTMP 數據被流化后傳給播放器,這意味著連接的帶寬必須要比視頻的數據速率大。如果連接中止了幾秒,流將卡住。這個問題在很大問題上可以使用包含一個低質量文件的動態流來進行預防。
    • </ul>

              最大的缺點是 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 上跑的通。
      • </ul>         CDNS
                以下 CDN (Content Delivery Networks 內容分發網絡) 能夠支持 RTMP,并且使用 JW Player 測試效果良好。它們都支持動態流,除了 CloudFront,也都支持現場直播

        • Akamai
        • CDNetworks
        • CloudFront (Amazon 網絡服務)
        • Edgecast
        • Limelight
        • </ul>         現場直播
                  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 文件動態流的例子。
          • </ul>         隱藏字幕
                    JW Player 支持 RTMP 直播和點播的字幕隱藏。只支持一個單一的 CC 軌道,而且這個軌道必須是 TX3G 格式的。Wowza 和 Adobe media server 都有能力使用 RTMP 發送 TX3G 字幕。

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

             

                    嵌入一個流
                    嵌入一個 RTMP 流到 JW Player 6 只是簡單提供一個完整流 URL 的問題。這里是一個很基本的例子,播放一個 MP4 視頻:

            </div> </div>

                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 將會在移動終端播放:

            </div> </div>

                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)。
            • </ul>         JW Player 6 中,這兩塊被整合到單個 URL。JW Player 根據 mp4flv 或者 mp3 前綴的位置來決定應用和流之間的分割。
                      1. MP4/M4V/MOV/F4V 視頻需要一個 mp4: 前綴:

               
              </div>

              1. rtmp://example.com/vod/mp4:myFolder/myVideo.mp4  
              2. </ol> </div>
                        2. FLV 視頻或者一個直播流 (FLV 容器下的) 需要一個 flv: 前綴:

                 
                </div>

                1. rtmp://example.com/vod/flv:myFolder/myVideo.flv  
                2. rtmp://example.com/live/flv:myFolder/myLiveStream  
                3. </ol> </div>
                          3. MP3 音頻需要一個 mp3: 前綴:

                   
                  </div>

                  1. rtmp://example.com/vod/mp3:myFolder/mySong.mp3  
                  2. </ol> </div>
                            4. M4A/F4A/AAC 音頻文件也需要一個 mp4: 前綴:

                     
                    </div>

                    1. rtmp://example.com/vod/mp4:myFolder/mySong.m4a  
                    2. </ol> </div>

                              如果沒有找到任何前綴,player 在文件名最后一個 / 之后對應用和流進行分割。前綴隨后被自動添加 (mp4:, mp3:)。注意flv 前綴并不被 Wowza/Adobe 服務器內部使用,因此 JW Player 將在請求流之前將其剝離。

                       

                              動態流
                              除了加載單一 RTMP 流之外,JW Player 6 支持加載動態流。一個動態流包含多個具有同一內容的單流,它們具有不同的品質。JW Player 允許在這樣一個流中進行不同品質的自動或者手工切換。
                              動態流必須使用叫做 SMIL manifest 設置。這是一些包含有 RTMP 應用路徑加上存放在 RTMP 服務器上的流的路徑的簡單的 XML 文件。播放器經常假定一個帶有.smil 后綴的文件是一個 RTMP SMIL manifest:

                      </div> </div>

                          jwplayer("myElement").setup({  
                              file: "/assets/myVideo.smil",  
                              image: "/assets/myVideo.jpg",  
                              height: 360,  
                              width: 640  
                          });  

                              這是另一個例子,使用了一個 RTMP 動態流 (為桌面) 和一個漸進 MP4 下載 (為移動終端):

                      </div> </div>

                          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 內容
                              這是一個基本的例子,使用了三個不同的流:

                      </div>

                      <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>


                      1. </ol> </div>
                                品質的切換由 JW Player 自動完成,它將選用最高品質: