我要做的是加载一个包含两个AdaptationSets的MPD文件,一个视频列表和一个音频列表(两者都属于同一个原始mp4并用MP4Box剥离) - 最终同时播放它们获得与原始文件相同的,有凝聚力的回放。
以下示例有效,但一旦解析清单,我一次只能传输一个AdaptationSet或另一个。我觉得,使用Media Source Extensions API,我应该只是能够为mediaSource添加一个SourceBuffer用于音频,一个用于视频,但这似乎不起作用(下面没有概述)。这是正确的想法吗?我想另一种选择是创建一个视频DOM元素和一个音频DOM元素,并尝试从那里散列出来,但即便想到这听起来也不对我...你们有关于MSE,MPEG-DASH的任何参考资料等有关于处理两个同时流的任何信息?
...
在检索MPD清单时,这大致是我的JavaScript归结为:
...
xhr.onload = function(_) {
var video = document.getElementById("video");
var info = parseManifest(xhr.response);
if typeSupportedEtc(info.mimeType) {
var mediaSource = new MediaSource();
video.src = URL.createObjectURL(mediaSource)
mediaSource.addEventListener("sourceopen", function(_) {
var sourceBuffer = this.addSourceBuffer(info.mimeType);
// Initialize this nonsense...
// Fetch next segment, append to buffer...
// Then loop over segments til you can't loop no mo'...
// Indicate end of stream.
});
}
};
...
MPD本身并不特别,所以为了简洁起见,只需发布相关部分:
...
<Period duration="...">
<AdaptationSet ...>
...
<SegmentList timescale="24000" duration="96000">
<Initialization sourceURL="file-video-init.mp4"/>
<SegmentURL media="file-video-01.m4s"/>
...
</SegmentList>
...
</AdaptationSet>
<AdaptationSet ...>
...
<SegmentList timescale="48000" duration="192000">
<Initialization sourceURL="file-audio-init.mp4"/>
<SegmentURL media="file-audio-01.m4s"/>
...
</SegmentList>
...
</AdaptationSet>
</Period>
...
(我已经尝试了很多合成清单的方法,但是this way似乎已经产生了最小的复杂性,为了这个问题。)