設定自適應流媒體源
假設您想在伺服器上設定一個自適應流媒體源,以便在 HTML 媒體元素中使用。您將如何操作?本文解釋瞭如何操作,並介紹了兩種最常見的格式:MPEG-DASH 和 HLS(HTTP 即時流)。
選擇格式
在自適應流格式方面,有很多選擇;我們決定選擇以下兩種,因為它們之間可以支援大多數現代瀏覽器。
- MPEG-DASH
- HLS(HTTP 即時流)
為了自適應地流式傳輸媒體,我們需要將媒體分成塊。我們需要提供多個不同質量的檔案,這些檔案分佈在多個時間點上。質量和時間點越多,流的“自適應性”就越強,但我們通常希望在大小、編碼時間和自適應性之間找到一個務實的平衡。
好訊息是,一旦我們以適當的格式對媒體進行編碼,我們就幾乎可以開始了。對於透過 HTTP 進行的自適應流,不需要特殊的伺服器端元件。
MPEG-DASH 和 HLS 都使用播放列表格式來構建構成可能流的媒體元件。各種位元率流被分成片段並放置在相應的伺服器資料夾中——我們必須向媒體播放器提供一個連結來查詢檔案或播放列表,這些檔案或播放列表指定了這些流資料夾的名稱和位置。
MPEG-DASH 編碼
MPEG-DASH 是一種自適應位元率流技術,它支援透過網際網路從傳統的 HTTP Web 伺服器交付媒體內容。
媒體演示描述 (MPD) 檔案用於儲存有關各種流及其關聯頻寬的資訊。在您的影片源 (src) 屬性中,您指向 MPD 而不是像非自適應媒體那樣指向媒體檔案。
MPD 檔案告訴瀏覽器各種媒體片段位於何處,它還包括諸如 mimeType 和編解碼器之類的元資料,以及其他詳細資訊,例如位元組範圍——它是一個 XML 文件,在許多情況下將為您生成。
我們可以使用一些配置檔案。我們將看看用於點播 (VOD) 的按需配置檔案和即時配置檔案。
對於即時服務流,即時配置檔案是必需的。配置檔案之間的流切換功能相同。
使用即時配置檔案而不是按需配置檔案進行 VOD 內容的其他原因可能是
- 您的客戶端或伺服器不支援範圍請求
- 您的伺服器無法有效地快取範圍請求
- 您的伺服器無法有效地預取範圍請求
- SIDX* 很大,並且必須首先載入它會稍微減慢啟動速度
- 您希望將原始檔案用於 DASH 和其他形式的交付(例如 Microsoft Smooth Streaming)作為過渡策略
- 您可以將相同的媒體檔案用於即時傳輸和稍後的 VOD
*SIDX 或 SegmentIndexBox 是一個結構,透過給出其最早的呈現時間和其他元資料來描述一個片段,並且通常會構成 MPD 檔案的大部分。
按需配置檔案
此配置檔案允許在“按需”之間切換流——也就是說,您只需要提供一組連續的檔案併為每個檔案指定頻寬,然後將自動選擇相應的檔案。
這是一個簡單的示例,它提供了一個音訊軌道表示和四個單獨的影片表示。
<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="urn:mpeg:dash:schema:mpd:2011"
xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd"
type="static"
mediaPresentationDuration="PT654S"
minBufferTime="PT2S"
profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
<BaseURL>http://example.com/ondemand/</BaseURL>
<Period>
<!-- English Audio -->
<AdaptationSet mimeType="audio/mp4" codecs="mp4a.40.5" lang="en" subsegmentAlignment="true" subsegmentStartsWithSAP="1">
<Representation id="1" bandwidth="64000">
<BaseURL>ElephantsDream_AAC48K_064.mp4.dash</BaseURL>
</Representation>
</AdaptationSet>
<!-- Video -->
<AdaptationSet mimeType="video/mp4" codecs="avc1.42401E" subsegmentAlignment="true" subsegmentStartsWithSAP="1">
<Representation id="2" bandwidth="100000" width="480" height="360">
<BaseURL>ElephantsDream_H264BPL30_0100.264.dash</BaseURL>
</Representation>
<Representation id="3" bandwidth="175000" width="480" height="360">
<BaseURL>ElephantsDream_H264BPL30_0175.264.dash</BaseURL>
</Representation>
<Representation id="4" bandwidth="250000" width="480" height="360">
<BaseURL>ElephantsDream_H264BPL30_0250.264.dash</BaseURL>
</Representation>
<Representation id="5" bandwidth="500000" width="480" height="360">
<BaseURL>ElephantsDream_H264BPL30_0500.264.dash</BaseURL>
</Representation>
</AdaptationSet>
</Period>
</MPD>
生成 MPD 檔案後,您可以從影片標籤內引用它。
<video src="my.mpd" type="application/dash+xml"></video>
最好為尚不支援 MPEG-DASH 的瀏覽器提供備用方案
<video>
<source src="my.mpd" type="application/dash+xml" />
<!-- fallback -->
<source src="my.mp4" type="video/mp4" />
<source src="my.webm" type="video/webm" />
</video>
即時配置檔案
處理 MPEG-DASH 時一個有用的軟體是Dash Encoder。它使用MP4Box將媒體編碼為 MPEG-DASH 格式。
注意:您需要熟悉 make 檔案和安裝依賴項才能使此軟體正常執行。
注意:由於 MPEG-DASH 解碼部分使用 JavaScript 完成,並且 MSE 檔案通常使用 XHR 獲取,請記住同源策略。
注意:如果您使用 WebM,則可以使用本教程中所示的方法HTML 5 影片的 DASH 自適應流。
編碼後,您的檔案結構可能如下所示
play list -> /segments/news.mp4.mpd main segment folder -> /segments/main/ 100 Kbps segment folder -> /segments/main/news100 contains (1.m4s, 2.m4s, 3.m4s … ) 200 Kbps segment folder -> /segments/main/news200 contains (1.m4s, 2.m4s, 3.m4s … ) 300 Kbps segment folder -> /segments/main/news300 contains (1.m4s, 2.m4s, 3.m4s … ) 400 Kbps segment folder -> /segments/main/news400 contains (1.m4s, 2.m4s, 3.m4s … )
播放列表或.mpd檔案包含明確列出所有各種位元率檔案所在位置的 XML。
<?xml version="1.0"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:DASH:schema:MPD:2011" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011" profiles="urn:mpeg:dash:profile:isoff-main:2011" type="static" mediaPresentationDuration="PT0H9M56.46S">
<BaseURL>
http://example.com/segments
</BaseURL>
<Period start="PT0S">
<AdaptationSet bitstreamSwitching="true">
<Representation id="0" codecs="avc1" mimeType="video/mp4" width="320" height="240" startWithSAP="1" bandwidth="46986">
<SegmentBase>
<Initialization sourceURL="main/news100/1.m4s" range="0-862"/>
</SegmentBase>
<SegmentList duration="1">
<SegmentURL media="main/news100/2.m4s" mediaRange="863-7113"/>
<SegmentURL media="main/news100/3.m4s" mediaRange="7114-14104"/>
<SegmentURL media="main/news100/4.m4s" mediaRange="14105-17990"/>
</SegmentList>
</Representation>
<Representation id="1" codecs="avc1" mimeType="video/mp4" width="320" height="240" startWithSAP="1" bandwidth="91932">
<SegmentBase>
<Initialization sourceURL="main/news200/1.m4s" range="0-864"/>
</SegmentBase>
<SegmentList duration="1">
<SegmentURL media="main/news200/2.m4s" mediaRange="865-11523"/>
<SegmentURL media="main/news200/3.m4s" mediaRange="11524-25621"/>
<SegmentURL media="main/news200/4.m4s" mediaRange="25622-33693"/>
</SegmentList>
</Representation>
<Representation id="1" codecs="avc1" mimeType="video/mp4" width="320" height="240" startWithSAP="1" bandwidth="270370">
<SegmentBase>
<Initialization sourceURL="main/news300/1.m4s" range="0-865"/>
</SegmentBase>
<SegmentList duration="1">
<SegmentURL media="main/news300/2.m4s" mediaRange="866-26970"/>
<SegmentURL media="main/news300/3.m4s" mediaRange="26971-72543"/>
<SegmentURL media="main/news300/4.m4s" mediaRange="72544-95972"/>
</SegmentList>
</Representation>
…
</AdaptationSet>
</Period>
</MPD>
MPD 檔案告訴瀏覽器各種媒體片段位於何處,它還包括諸如 mimeType 和編解碼器之類的元資料,以及其他詳細資訊,例如位元組範圍。通常,這些檔案將為您生成。
注意:您還可以將音訊和影片流分成單獨的檔案,然後可以根據頻寬分別對它們進行優先順序排序和提供服務。
生成 MPD 檔案後,您可以從<video>元素中按預期引用它
<video src="my.mpd" type="application/dash+xml"></video>
最好提供一個備用方案
<video>
<source src="my.mpd" type="application/dash+xml" />
<!-- fallback -->
<source src="my.mp4" type="video/mp4" />
<source src="my.webm" type="video/webm" />
</video>
注意:MPEG-DASH 播放依賴於dash.js和瀏覽器對媒體源擴充套件的支援,請參閱最新的dash.js 參考播放器。
HLS 編碼
HTTP 即時流 (HLS) 是 Apple 實現的一種基於 HTTP 的媒體流協議。它已整合到 iOS 和 OSX 平臺中,並且在移動和桌面 Safari 以及大多數 Android 裝置上都能很好地工作,但有一些注意事項。
媒體通常編碼為 MPEG-4(H.264 影片和 AAC 音訊),並打包到 MPEG-2 傳輸流中,然後將其分解成片段並儲存為一個或多個.ts媒體檔案。Apple 提供工具將媒體檔案轉換為適當的格式。
HLS 編碼工具
有許多有用的工具可用於 HLS 編碼
- 流片段器——Apple 為 Mac 平臺提供的工具——從本地網路獲取媒體流,並將媒體分成大小相等的媒體檔案以及索引檔案。
- Apple 還為 Mac 提供了檔案片段器——它接收適當編碼的檔案,將其分解並生成索引檔案,方式類似於流片段器。
注意:您可以在使用 HTTP 即時流中找到有關這些工具的更多詳細資訊。
索引檔案(播放列表)
HLS 索引檔案(類似於 MPEG-DASH 的.mpd檔案)包含有關所有媒體片段所在位置的資訊,以及其他元資料,例如頻寬應用程式。Apple 使用.m3u8格式(其.m3u播放列表格式的擴充套件)作為索引檔案——請參見下面的示例
#EXT-X-VERSION:3 #EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-MEDIA-SEQUENCE:1 # Old-style integer duration; avoid for newer clients. #EXTINF:10, http://media.example.com/segment0.ts # New-style floating-point duration; use for modern clients. #EXTINF:10.0, http://media.example.com/segment1.ts #EXTINF:9.5, http://media.example.com/segment2.ts #EXT-X-ENDLIST
注意:有關如何為 Apple 的 HLS 格式編碼媒體的全面資訊,請參閱Apple 的開發者頁面。
另請參閱
有關自適應流的更多資源。