MSE中的同步音频/视频分段流

时间:2016-12-13 23:43:00

标签: javascript video-streaming audio-streaming mpeg-dash media-source

我要做的是加载一个包含两个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似乎已经产生了最小的复杂性,为了这个问题。)

0 个答案:

没有答案