Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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
Javascript 如何对媒体片段的任何部分进行范围请求?_Javascript_Http_Media_Codec_Fetch Api - Fatal编程技术网

Javascript 如何对媒体片段的任何部分进行范围请求?

Javascript 如何对媒体片段的任何部分进行范围请求?,javascript,http,media,codec,fetch-api,Javascript,Http,Media,Codec,Fetch Api,如果我们想发出HTTP/1.0或HTTP/1.1请求,例如给定媒体资源的字节20000到100000或秒20到35,例如.webm或.ogg音频或.mp4视频,如果响应是能够在没有其他媒体资源的情况下播放的离散媒体片段,我们将如何实现这一点 比如说 let headers = new Headers(); let range = 1024 * 1024; headers.append("Range", "bytes=0-" + range); let request = new Request

如果我们想发出
HTTP/1.0
HTTP/1.1
请求,例如给定媒体资源的字节20000到100000或秒20到35,例如
.webm
.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
响应状态,但不会在
元素处呈现媒体播放

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

您不能

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

不同的媒体格式将具有不同的解析规则,数据块的顺序不同,仅获取部分原始数据将破坏数据的整体结构。因此,对于某些文件格式,您可以通过仅提供文件的开头来播放媒体的开头,但所有媒体格式都不允许这样做,甚至不希望从开始到结束读取

但是可以做的是使用MediaElement的
src

#t=[starttime][,endtime]

consturl='1〕https://upload.wikimedia.org/wikipedia/commons/4/4b/011229beowulf_grendel.ogg';
btn.onclick=e=>{
//演示的快速输入检查
如果(最大值>aud.持续时间)
最大值=aud.duration;
如果(最小值>最大值)
最小值=最大值-1;
//构造我们的时间范围参数
设范围='#t='+最小值+','+最大值;
//将其附加到我们的原始url
aud.src=url+范围;
}
btn.onclick()

开始: 完:
重新加载
@charlietfl Yes刚刚发现206可能意味着它必须返回它header@charlietfl组成了一个解决方案,其中有一些问题。有兴趣查看其他开发人员如何解决此问题。@charlietfl@charlietfl-fwiw,这是在试图将获取媒体片段作为独立文件的结束标签实现为“结束”时所遵循的解决方案?是的,熟悉媒体片段URI。是否可以创建媒体片段的每个时间片段的记录(可单独播放),并将片段合并到可无缝播放的单个文件中?我们如何提取、创建或重用每种媒体类型的媒体头?为什么可以播放从
0
开始的范围,尽管不是从
0
开始的范围?@guest271314,是的,您显然可以使用此方法为每个片段创建一个新的MediaElement,然后使用其
captureStream
方法以及MediaRecorder导出这些片段。如果要连接它们,则必须控制一个流,在该流中更新原始源的currentTime,因为无法以比x1更快的速度进行记录。至于为什么它不适用于0以外的开始范围请求,这只是因为幸运的是,文件所需的所有元数据都包含在此范围内。如果它位于文件的末尾,您将无法播放其中的任何内容。如何提取必要的元数据并在需要它们的范围内复制和包含元数据?对于webm,这可能是最好的开始,因为它有一个很好的类似xml的数据结构。但请注意,chrome本身就是为了记录文件。所以,如果你碰巧有足够的时间做这件事,请毫不犹豫地告诉我们。(您可以找到用于NodeJ的EBML解析器示例,这些示例可能会帮助您完成任务)