在 HLS 中提供相同音频再现的多种编码

Provide multiple encodings of same audio rendition in HLS

我想使用 HLS 自适应流式传输视频。

只要有合适的设备和足够的带宽,视频应该以高清和 5.1 声音呈现。

在带宽较低或不需要 5.1 声音的设备上,应使用较低的分辨率和立体声。

现在,我的主播放列表如下所示:

#EXTM3U
#EXT-X-INDEPENDENT-SEGMENTS

#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="AUDIO",NAME="en 5.1",LANGUAGE="en",URI="audio/en_5.1.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="AUDIO",NAME="en 2.0",LANGUAGE="en",URI="audio/en_2.0.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="AUDIO",NAME="de 5.1",LANGUAGE="de",URI="audio/de_5.1.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="AUDIO",NAME="de 2.0",LANGUAGE="de",URI="audio/de_2.0.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="AUDIO",NAME="es 2.0",LANGUAGE="es",URI="audio/es_2.0.m3u8"

#EXT-X-STREAM-INF:BANDWIDTH=944846,AVERAGE-BANDWIDTH=933666,CODECS="avc1.64001E,mp4a.40.2",RESOLUTION=768x328,AUDIO="AUDIO"
video_0.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1269710,AVERAGE-BANDWIDTH=1252915,CODECS="avc1.64001F,mp4a.40.2",RESOLUTION=1024x436,AUDIO="AUDIO"
video_1.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2003662,AVERAGE-BANDWIDTH=1976439,CODECS="avc1.640020,mp4a.40.2",RESOLUTION=1600x682,AUDIO="AUDIO"
video_2.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2954190,AVERAGE-BANDWIDTH=2911727,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=1920x818,AUDIO="AUDIO"
video_3.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=716238,AVERAGE-BANDWIDTH=709068,CODECS="avc1.640015,mp4a.40.2",RESOLUTION=512x218,AUDIO="AUDIO"
video_4.m3u8

但是,这显然不会产生正确的结果:

这 5 个音轨中的每一个都作为单独的演绎呈现给用户。

但是,只应显示 3 个版本:“en,de,es”

5.1 和 2.0 之间的选择应该是自动的。

有什么方法可以用 HLS 实现吗?

视频流是变体流。我们可以通过定义两个具有不同成员的音频组来提供不同的音频编码,这些音频组具有相同的属性(除了通道),然后从特定变体中引用这两个不同的组:

#EXTM3U
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-VERSION:6

#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio_l",CHANNELS="2",NAME="Audio 0",URI="audio_0l.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio_l",CHANNELS="2",NAME="Audio 1",URI="audio_1l.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio_l",CHANNELS="2",NAME="Audio 2",URI="audio_2l.m3u8"

#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio_h",CHANNELS="6",NAME="Audio 0",URI="audio_0h.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio_h",CHANNELS="6",NAME="Audio 1",URI="audio_1h.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio_h",CHANNELS="2",NAME="Audio 2",URI="audio_2h.m3u8"

#EXT-X-STREAM-INF:BANDWIDTH=1637313,AVERAGE-BANDWIDTH=1609092,CODECS="avc1.640020,mp4a.40.2",RESOLUTION=1600x682,AUDIO="audio_l"
video_3.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=376055,AVERAGE-BANDWIDTH=370421,CODECS="avc1.640015,mp4a.40.2",RESOLUTION=512x218,AUDIO="audio_l"
video_0.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=597555,AVERAGE-BANDWIDTH=588987,CODECS="avc1.64001E,mp4a.40.2",RESOLUTION=768x328,AUDIO="audio_l"
video_1.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=916599,AVERAGE-BANDWIDTH=900940,CODECS="avc1.64001F,mp4a.40.2",RESOLUTION=1024x436,AUDIO="audio_l"
video_2.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2757067,AVERAGE-BANDWIDTH=2715497,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=1920x818,AUDIO="audio_h"
video_4.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=4203897,AVERAGE-BANDWIDTH=4173401,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=1920x818,AUDIO="audio_h"
video_5.m3u8

这样,当播放切换到更高的视频分辨率时,如果给定的再现可用,它也会切换到环绕声。

显然,将视频分辨率的切换与音频通道数的切换结合起来并不完美,但这是我能为 HLS 想到的最佳方案。

请注意,我们也在“audio_h”组中包含了“Audio 2”,它也只能在立体声中使用,因为这些组需要有相同的成员。