Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ffmpeg MPEG-DASH和片段化mp4_Ffmpeg_Html5 Video_Mp4_Mpeg Dash - Fatal编程技术网

Ffmpeg MPEG-DASH和片段化mp4

Ffmpeg MPEG-DASH和片段化mp4,ffmpeg,html5-video,mp4,mpeg-dash,Ffmpeg,Html5 Video,Mp4,Mpeg Dash,我对片段化mp4的理解是,它是一个单独的文件,但在内部它是以片段的形式构造的。有人能给我解释一下如何在DASH的.mpd文件中处理这些片段吗?我看到的.mpd文件似乎用不同的url来处理不同的段,但我想,一个片段化的mp4必须通过字节偏移量来处理到同一个url中。浏览器如何知道什么时间对应于什么字节范围?服务器有一个清单,可以通过扫描文件中的moof框来创建该清单。一个moof+mdat=一个片段。当请求片段时,会在清单中查找文件偏移量,并返回正确的框。据我所知。。。对于仪表板“onDemand

我对片段化mp4的理解是,它是一个单独的文件,但在内部它是以片段的形式构造的。有人能给我解释一下如何在DASH的.mpd文件中处理这些片段吗?我看到的.mpd文件似乎用不同的url来处理不同的段,但我想,一个片段化的mp4必须通过字节偏移量来处理到同一个url中。浏览器如何知道什么时间对应于什么字节范围?

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

据我所知。。。对于仪表板“onDemand”配置文件,仪表板包装员的工作是创建*.mpd(清单)并指定哪些字节范围映射到某个段(可能是多个片段)。然后,客户端加载*.mpd并对清单中的范围发出http字节范围请求。我认为DASH“live”配置文件更类似于平滑流媒体,因为每个片段都有一个url

如果您需要找出mp4容器中片段的位置,我相信这些信息在段“sidx”框中。

这里是一个MPEG DASH主配置文件。此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"/>


元素中,可以将片段寻址到相同的url中,并且您可以在
@mediarrange
属性中找到字节偏移量。

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

  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);

ffmpeg现在似乎有了。

您所说的清单是否只是发送给客户端的清单(.mpd文件)?在我读到的关于DASH的所有地方,他们谈论的唯一清单都是发送给客户机的清单,所以我不知道服务器使用的是单独的清单。你能给我指一个推荐人吗?我的经验是在silverlight。这是一种不同的清单格式,但视频文件格式相同。在silverlight中,您提供服务器清单(ism)。但是,清单是通过扫描媒体文件生成的。我假设清单是由保存在内存中的dash服务器生成的。但你是rite,我不是100%确定。我看到没有人回答你问题的第2部分“浏览器如何知道什么时间对应于什么字节范围?”(