PJCHENder 未整理筆記

[Internet] HTTP Media Live Streaming, HLS

2018-05-29

@(網際網路)

[Internet] HTTP Media Live Streaming, HLS

Live Streamed 和 Static media 的差別

keywords: progressive download, adaptive streaming

通常我們將已有實體檔案的媒體檔稱作靜態媒體(static media),不論它是 mp3webm,這些檔案通常存在伺服器上,並且就像其他靜態檔案一樣,可以傳送到瀏覽器,通常把這種稱作漸進式下載(progressive download)

相較於靜態檔案,即時串流媒體(Live streamed media)通常沒有確切的開始和結束時間,它是透過伺服器傳送串流資料到瀏覽器,通常是自適性(adaptive),通常會需要不同的檔案格式和特別的伺服器軟體來達到。

其中**即時串流(live streaming)很重要的是要讓播放器和串流保持同步,而自適性串流(adaptive streaming)**就是一種可以達到並降低流量的技術。它的概念是去監控資料傳輸的比例,如果它沒有持續,那麼就降低頻寬(bandwidth),也就是降低串流媒體的品質。為了達到這樣的效果,我們需要使用特定的檔案格式,而即時串流的檔案格式通常都可以透過將串流切割成許多小片段,並且將這些片段以不同的品質或位元速率(bit rate)來使用。

串流的技術並不只能用在即時串流上,過去傳統的漸進式下載也可以使用。

Streaming Protocols

  • HTTP
  • RTMP(Real Time Messaging Protocol):由 Adobe 發展,相關的包含 RTMPE, RTMPS, RTMPT
  • RTSP (Real Time Streaming Protocol):通常會搭配 RTP (Real-time Transport Protocol)RTCP (Real-time Control Protocol) 一起用來傳輸媒體串流,多數瀏覽器仍不支援

Media Source Extensions (MSE)

Media Source Extensions 是 W3C 用來延伸 HTMLMediaElement 以允許 JavaScript 產生影音串流來播放,讓 JavaScript 產生串流可以增加很多可用的情境,像是自適性串流(adaptive streaming)和 Time shifting live streams。

Media Source Extensions @ W3C Editors Draft

影片串流檔案格式(Video Streaming File Formats)

MPEG-DASH

DASH 指的是 Dynamic Adaptive Streaming over HTTP,透過 Media Source Extensions 的 JavaScript 函式庫可以支援多數瀏覽器(如,DASH.js ),它讓我們可以使用 XHR 下載許多影片串流的片段(chunks),並將這些片段結合起來透過 <video> 元素播放。舉例來說,當我們偵測到網路速度變慢時,我們開始請求低品質(較小的)片段來供之後使用,這個技術也讓廣告相關的片段可以插入串流中。

[對 WebM 使用 MPEG DASH 自適性串流](use WebM with the MPEG DASH adaptive streaming system.) @ webm wiki

HLS (HTTP Live Streaming)

HLS 是由 Apple 發明,也是自適性的。它可以透過 JavaScript 解碼,因此多數瀏覽器都支援。在串流的開始會有 extended M3U (m3u8) playlist 可以下載,它包含許多所提供的 sub-streams 描述性資料(metadata)。

音檔串流檔案格式(Audio Streaming File Formats)

Opus

Opus 是一種買斷式授權(royalty free)且公開的檔案格式,可以對不同類型的音訊檔,優化在不同位元速率(bitrate)下品質。音樂和演說有不同的優化方式,其中 Opus 使用 SILK 和 CELT 編解碼器(codec)來達到。當今多數的瀏覽器有支援此格式。

[Opus 是 WebRTC 瀏覽器實作時必要的格式](Opus is a mandatory format for WebRTC browser implementations.)

MP3, AAC, Ogg Vorbis

大部分的音檔格式都可以使用特定的伺服器技術來處理串流。

在串流音檔時,使用非串流的檔案格式相對容易些,因為和影片不同,音檔沒有影格(keyframes)。

伺服器端的串流技術(Server-side Streaming Technologies)

為了要能夠串流即時的媒體,你需要在伺服器使用特定的串流軟體或第三方服務。

GStreamer

GStreamer 是一個開源且跨平台的多媒體框架,讓你可以建立許多用來處理媒體的元件,包含串流元件,透過它的插件系統,GStreamer 支援多種編解碼(codec),包含 MPEG-1, MPEG-2, MPEG-4, H.261, H.263, H.264, RealVideo, MP3, WMV 和 FLV。

GStreamer 的插件像是 souphttpclientsinkshout2send 用來透過 HTTP 串流媒體,你也可以整合進 Python 的 Twisted 框架或使用其他像是 Flumotion 這類開源的串流軟體。

如果是針對 RTMP 的傳輸,可以使用 Nginx RTMP Module

SHOUTcast

SHOUTcast 是擁有跨平台串流媒體的獨家技術,它是由 Nullsoft 開發,可以允許數位 MP3 或 AAC 的音檔被廣播。使用在網頁上時,依樣是透過 HTTP 傳輸。

Icecast

Icecast 伺服器是一個媒體串流的開源技術,由 Xiph.org Foundation 維護,它可以透過 SHOUTcast protocol 串流 Ogg Vorbis/Theora、MP3 或 ACC 的檔案格式。

SHOUTcast 和 Icecast 算是最任何的媒體串流技術,但還有其他許多可用的媒體串流系統,以及[第三方的串流服務](third party streaming services )。

延伸閱讀

參考

原始文章

掃描二維條碼,分享此文章