2016年2月26日 星期五

HLS (HTTP Live streams) 介紹

許多可以在 iPad 上正常播放的影片,並無法直接串流到 AppleTV。為了讓老婆方便看影片,因此便想找個方法讓 影片能夠串流到 AppleTV,因此需要先研究一下 HLS 機制。

 HLS 介紹

HLS 是 APPLE公司所提出的流媒體網路傳輸協議,已提交IETF審查,現在仍屬於 RFC Draft
基本原理為將檔案切成許多段的小檔案(segment),每次用戶端透過 HTTP 取得資料時,只會取得其中的幾個小檔案

實際作法是
  1. 用戶端透過 HTTP取得伺服器端的 m3u8 播放清單,此清單內會紀錄將提供下載的檔案
  2. 用戶端透過 HTTP取得對應的檔案,並進行撥放
  3. 若撥放清單內的檔案都已下載成功,則透過 HTTP更新伺服器端的 m3u8 播放清單內容。
  4. 用戶端透過 HTTP取得對應的檔案
  5. 重複步驟 3,4 直到撥放清單內沒有任何檔案
Apple 官方提供一個例子,如果你的瀏覽器可以支援HLS (例如:Safari ),便可以直接點擊這個連結撥放HLS的流媒體。

或者可以使用下列指令,透過 ffplay 進行播放:
$ffplay  https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/bipbop_4x3_variant.m3u8


HLS工具

APPLE 提供了六種工具,可以用來建立HLS Server所需要的內容
  • mediastreamsegmenter 
  • mediafilesegmenter 
  • mediasubstitlesegmenter
  • mediastreamvalidator 
  • variantplaylistcreator 
  • id3taggenerator 

FFMpeg 也可以透過以下指令,建立 HLS 的串流資料,參考 https://www.ffmpeg.org/ffmpeg-formats.html#segment
ffmpeg -i in.mkv -map 0 -codec:v libx264 -codec:a libfaac -f ssegment -segment_list out.list out%03d.ts

注意:
  • Apple Tools 預設 segment length = 10 second
  • FFmpeg 預設 segment length = 2 second

HLS實作

1. 用戶端 (Apple TV)
摘錄 spec 內容如後,Apple TV2 可以直接當成 HLS Client 
All devices running iOS 3.0 and later include built-in client software for HTTP Live Streaming. The Safari browser can play HTTP streams within a webpage on iPad and desktop computers, and Safari launches a full-screen media player for HTTP streams on iOS devices with small screens, such as iPhone and iPod touch. Apple TV 2 and later includes an HTTP Live Streaming client.   
iOS developers can use the MediaPlayer and AVFoundation frameworks to create iOS apps.
2. 伺服器端 (iPad, iPhone or iMac)
摘錄 spec 內容如後, 
Many existing streaming services require specialized servers to distribute content to end users. These servers require specialized skills to set up and maintain, and in a large-scale deployment this can be costly. HTTP Live Streaming avoids this by using standard HTTP to deliver the media.HTTP Live Streaming sends audio and video as a series of small files, typically of about 10 seconds duration, called media segment files.
 
要成為一個 HLS Server,需要以下軟體元件
  • Web Server:提供 m3u8 播放清單。
  • Transcoder:若檔案內容並非 H.264 + AAC,那麼便需要進行轉檔。此部分選擇使用 ffmpeg。
  • Media Stream Segmenter:將欲播放的檔案切成 segment。此部分選擇使用 ffmpeg。
3. ffmpeg 命令列的使用方式
4. 簡易的實作方式
  • 先架設一個 web server,若你的電腦是iMAC,可以參考此篇
  • 接著透過上述流媒體產生 m3u8的方式,將欲播放的資料放入此 web server
  • 然後使用 iPad 或 iPhone 的 safari 播放此 m3u8,例如:http://192.168.2.105/test.m3u8
  • 按下 AirPlay 即可。
TODO: 撰寫一個app,將iPad 當成一個簡單的 Streaming Server,讓所有能夠在 iPad 播放的檔案(ffmpeg能夠解開的檔案),都可以串流到  AppleTV。

注意:
只要 app 會在行動網路上傳送影像,就必須符合下列兩項,否則 app 會被 reject
1. 如果影像長度超過10分鐘,或是每五分鐘會傳輸大於5MB資料量,就必須使用 HLS
2. 必須提供一個 64Kbps或是更低頻寬的串流 
原文如下: 
If your app delivers video over cellular networks, and the video exceeds either 10 minutes duration or 5 MB of data in a five minute period, you are required to use HTTP Live Streaming. (Progressive download may be used for smaller clips.) 
If your app uses HTTP Live Streaming over cellular networks, you are required to provide at least one stream at 64 Kbps or lower bandwidth (the low-bandwidth stream may be audio-only or audio with a still image). 
These requirements apply to iOS apps submitted for distribution in the App Store for use on Apple products. Non-compliant apps may be rejected or removed, at the discretion of Apple.  
雖然是這樣規定,但實際上許多 app 仍然使用 RTSP 協定,並且也成功上架了,Apple對於這點並沒有嚴格審查。

參考資料