MPEG-DASH 和分段 mp4

Posted

技术标签:

【中文标题】MPEG-DASH 和分段 mp4【英文标题】:MPEG-DASH and fragmented mp4 【发布时间】:2013-08-13 06:11:13 【问题描述】:

我对分段 mp4 的理解是它是一个单一的文件,但在内部它被结构化为片段。有人可以向我解释如何在 DASH 的 .mpd 文件中处理这些片段吗?我见过的 .mpd 文件似乎使用单独的 url 来处理各种段,但是我想,碎片化的 mp4 必须通过字节偏移量来处理相同的 url。那么浏览器如何知道什么时间对应什么字节范围呢?

【问题讨论】:

我看到没有人回答您问题的第 2 部分“浏览器如何知道什么时间对应于什么字节范围?” :( 【参考方案1】:

这是 MPEG DASH 主要配置文件的 example mpd。这个mpd描述的mp4文件是一个碎片化的mp4。如您所见:

<SegmentURL media="bunny_15s_200kbit/bunny_200kbit_dashNonSeg.mp4" mediaRange="868-347185"/>
<SegmentURL media="bunny_15s_200kbit/bunny_200kbit_dashNonSeg.mp4" mediaRange="347186-664464"/>

&lt;SegmentURL&gt;元素处,片段可以被寻址到同一个url,你可以在@mediaRange属性处找到字节偏移。

【讨论】:

【参考方案2】:

.mpd 文件有一个分段列表及其字节范围,如上所示。要访问这些段,您需要解析每一行的 mediarange 属性,并使用带有 setRequestHeader 的 XHR 之类的东西来请求它以指定字节范围。使用这种方法,不需要服务器组件。这是我一直在使用的一些代码:

  var xhr = new XMLHttpRequest();

  // Range is in format of 1234-34567
  // url is the .mp4 file path 
  if (range || url)  // make sure we've got content in our params
    xhr.open('GET', url);
    xhr.setRequestHeader("Range", "bytes=" + range); 
    xhr.send();
    xhr.responseType = 'arraybuffer';
    try 
      // watch the ready state
      xhr.addEventListener("readystatechange", function () 
        if (xhr.readyState == 4)  //wait for video to load
          // add response to buffer
          try    
            // videoSource is a sourceBuffer on your mediaSource object.             
            videoSource.appendBuffer(new Uint8Array(xhr.response));
            videoSource.onreadystatechange = function () 
              if (videoSource.readyState == videoSource.done) 
                videoElement.play();
              
            ;
           catch (e) 
            //  fail quietly  
          
        
      , false);

【讨论】:

【参考方案3】:

服务器有一个清单,可以通过扫描文件中的 moof 框来创建。 moof+mdat = 一个片段。当请求片段时,会在清单中查找文件偏移量并返回正确的框。

【讨论】:

您所说的清单是否只是发送给客户端的清单(.mpd 文件)?在我读到关于 DASH 的所有地方,他们谈论的唯一清单是发送给客户端的清单,所以我不知道服务器使用了一个单独的清单。你能给我指个参考吗? 我的经验是银光。它是一种不同的清单格式,但相同的视频文件格式。在silverlight 中,您提供服务器清单(ism)。然而,清单是通过扫描媒体文件生成的。我假设清单是由服务器生成的,并保存在内存中以供破折号使用。但你是仪式我不是 100% 确定。【参考方案4】:

据我了解...在 DASH 'onDemand' 配置文件的情况下,DASH 打包程序的工作是创建 *.mpd(清单)并指定哪些字节范围映射到一个段(可能是多个片段)。客户端然后加载 *.mpd 并对清单中的范围发出 http 字节范围请求。我认为 DASH 的“实时”配置文件更类似于流畅的流媒体,因为每个片段都有一个 url。

如果您需要找出片段在 mp4 容器中的位置,我相信此信息位于片段 'sidx' 框中。

【讨论】:

【参考方案5】:

看来 ffmpeg 现在有support for HLS directly as well。

【讨论】:

以上是关于MPEG-DASH 和分段 mp4的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 MPEG-DASH 流式传输多帧率视频?

编译具有分段时间线的 init.mp4 和 audio.mp4

在 FFMPEG 中创建分段 MP4 的刷新和延迟问题

如何在不下载整个片段的情况下使用媒体源缓冲区和分段 mp4 在特定时间启动视频?

MP4box对DASH支持 翻译

如何用ffmpeg输出碎片化的mp4?