我对分段 mp4 的理解是,它是一个单一的文件,但在内部它被结构化为片段。有人可以向我解释如何在 DASH 的 .mpd 文件中处理这些片段吗?我见过的 .mpd 文件似乎使用单独的 url 来处理各种段,但是我想,碎片化的 mp4 必须通过字节偏移量来处理相同的 url。那么浏览器如何知道什么时间对应什么字节范围呢?
问问题
19008 次
5 回答
7
这是 MPEG DASH 主要配置文件的示例 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"/>
在<SegmentURL>
元素处,可以将片段寻址到相同的 url,并且您可以在@mediaRange
属性处找到字节偏移量。
于 2013-08-22T16:42:29.580 回答
3
.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);
于 2013-12-18T21:29:09.820 回答
0
据我了解...在 DASH 'onDemand' 配置文件的情况下,DASH 打包程序的工作是创建 *.mpd(清单)并指定映射到段的字节范围(可能是片段数)。客户端然后加载 *.mpd 并对清单中的范围发出 http 字节范围请求。我认为 DASH 的“实时”配置文件更类似于流畅的流媒体,因为每个片段都有一个 url。
如果您需要找出片段在 mp4 容器中的位置,我相信此信息位于片段“sidx”框中。
于 2013-08-15T12:07:00.520 回答
0
服务器有一个清单,可以通过扫描文件中的 moof 框来创建。moof+mdat = 一个片段。当请求片段时,会在清单中查找文件偏移量并返回正确的框。
于 2013-08-12T03:36:36.090 回答
0
看来 ffmpeg 现在也直接支持 HLS 了。
于 2015-09-15T13:47:49.047 回答