如何为媒体片段的任何部分发出范围请求?

时间:2017-07-11 03:34:13

标签: javascript http media codec fetch-api

如果我们想要发出HTTP/1.0HTTP/1.1请求,例如给定媒体资源的字节20000到100000或秒20到35秒,.webm或{{ 1}}音频或.ogg视频,其中响应将是一个能够在没有媒体资源的其他部分的情况下播放的离散媒体片段,我们将如何实现这一目标?

例如

.mp4

加载和媒体播放

let headers = new Headers();
let range = 1024 * 1024;
headers.append("Range", "bytes=0-" + range); 
let request = new Request(url, {headers:headers});
fetch(request)
.then(response => response.blob())
.then(data => audio.src = URL.createObjectURL(data));

记录成功的let headers = new Headers(); let range = 1024 * 1024; headers.append("Range", "bytes=" + range + "-" + range * 2); let request = new Request(url, {headers:headers}); fetch(request) .then(response => response.blob()) .then(data => audio.src = URL.createObjectURL(data)); 200响应状态,但不会在206元素处呈现媒体播放。

如何为给定媒体创建范围请求,该请求仅返回所请求的资源范围作为能够在没有媒体的其他部分的情况下播放的离散资源,其中所请求的媒体片段可以是媒体资源的任何离散部分?

1 个答案:

答案 0 :(得分:1)

你根本无法做到。

您的浏览器绝对需要媒体文件(元数据)的标题才能解码其中包含的数据。

不同的媒体格式将具有不同的解析规则,其中数据块的排序方式不同,只获得原始数据的一部分将破坏整个数据结构。因此,对于某些文件格式,您可以通过仅提供文件的开头来播放媒体的开头,但所有媒体格式都不允许它,甚至不希望开始结束阅读

可以做的是使用MediaElement BUG的{​​{3}}:

src



#t=[starttime][,endtime]

const url = 'https://upload.wikimedia.org/wikipedia/commons/4/4b/011229beowulf_grendel.ogg';

btn.onclick = e => {
  // fast input check for the demo
  if (max.value > aud.duration)
    max.value = aud.duration;
  if (min.value > max.value)
    min.value = max.value - 1;
  // construct our timerange parameter
  let range = '#t=' + min.value + ',' + max.value;
  // append it to our original url
  aud.src = url + range;
}
btn.onclick();