gpt4 book ai didi

html - MediaSource API - 将多个视频附加/连接到一个缓冲区中

转载 作者:太空狗 更新时间:2023-10-29 15:07:46 28 4
gpt4 key购买 nike

更新:

所以我能够通过使用 offsetTimestamp 属性(在附加每个视频后增加它)来让它工作。

我现在的问题:1) 为什么在将 MediaSource.mode 设置为序列时没有正确完成?

2) 为什么我的 MediaSource.duration 总是“无穷大”而不是正确的持续时间?


我正在尝试使用 MediaSource API 附加多个视频文件并像播放 1 个视频一样无缝播放它们。

我已经根据规范 (DASH-MPEG) 正确地转码了我的视频,并且在单独播放它们时,它们工作正常。

但是,当我尝试追加多个时,我遇到了段相互覆盖、持续时间不正确等问题。即使一切似乎都按预期执行。

我试过使用 offsetTimestamp,但根据文档,将 MediaSource.mode 设置为“sequence”应该会自动处理这个问题。此外,出于某种原因,MediaSource.duration 似乎始终为“Infinity”,即使在附加了一个片段之后也是如此。

这是我的代码:

<script>
function downloadData(url, cb) {
console.log("Downloading " + url);

var xhr = new XMLHttpRequest;
xhr.open('get', url);
xhr.responseType = 'arraybuffer';
xhr.onload = function () {
cb(new Uint8Array(xhr.response));
};
xhr.send();
}

if (MediaSource.isTypeSupported('video/mp4; codecs="avc1.64001E"')) {
console.log("mp4 codec supported");
}

var videoSources = [
"{% static 'mp4/ff_97.mp4' %}",
"{% static 'mp4/ff_98.mp4' %}",
"{% static 'mp4/ff_99.mp4' %}",
"{% static 'mp4/ff_118.mp4' %}"
]

var mediaSource = new MediaSource();


mediaSource.addEventListener('sourceopen', function(e) {


var sourceBuffer = mediaSource.addSourceBuffer('video/mp4; codecs="avc1.64001E"');
sourceBuffer.mode = 'sequence';

console.log('SourceBuffer mode set to ' + sourceBuffer.mode);

sourceBuffer.addEventListener('updateend', function(e) {
console.log('Finished updating buffer');
console.log('New duration is ' + String(mediaSource.duration));

if (videoSources.length == 0) {
mediaSource.endOfStream();
video.currentTime = 0;
video.play();
return;
}

downloadData(videoSources.pop(), function(arrayBuffer) {
console.log('Finished downloading buffer of size ' + String(arrayBuffer.length));
console.log('Updating buffer');
sourceBuffer.appendBuffer(arrayBuffer);
});

console.log('New duration: ' + String(mediaSource.duration));

});

downloadData(videoSources.pop(), function(arrayBuffer) {
console.log('Finished downloading buffer of size ' + String(arrayBuffer.length));
console.log('Updating buffer');
sourceBuffer.appendBuffer(arrayBuffer);
});



}, false);

var video = document.querySelector('video');
video.src = window.URL.createObjectURL(mediaSource);

这是日志:

mp4 codec supported
(index):78 SourceBuffer mode set to sequence
(index):45 Downloading /static/mp4/ff_118.mp4
(index):103 Finished downloading buffer of size 89107
(index):104 Updating buffer
(index):81 Finished updating buffer
(index):82 New duration is Infinity
(index):45 Downloading /static/mp4/ff_99.mp4
(index):98 New duration: Infinity
(index):92 Finished downloading buffer of size 46651
(index):93 Updating buffer
(index):81 Finished updating buffer
(index):82 New duration is Infinity
(index):45 Downloading /static/mp4/ff_98.mp4
(index):98 New duration: Infinity
(index):92 Finished downloading buffer of size 79242
(index):93 Updating buffer
(index):81 Finished updating buffer
(index):82 New duration is Infinity
(index):45 Downloading /static/mp4/ff_97.mp4
(index):98 New duration: Infinity
(index):92 Finished downloading buffer of size 380070
(index):93 Updating buffer
(index):81 Finished updating buffer
(index):82 New duration is Infinity

最佳答案

2) Why is my MediaSource.duration always "Infinity" and not the correct duration?

您需要调用 MediaSource.endOfStream() 为了让 MediaSource 对象计算其 SourceBuffer 中片段的实际持续时间.我看到你正在这样做,但看起来你正在尝试访问 MediaSource.duration打电话前 endOfStream() .我建议你阅读 end of stream algorithm在 MSE 规范中,您会注意到它将导致调用 duration change algorithm .

如果你想拥有你的 <video>元素在调用前报告持续时间 MediaSource.endOfStream() ,您实际上可以使用 MediaSource.duration 设置一个值基于您自己对附加段的估计。

1) Why isn't this done properly when setting the MediaSource.mode to sequence?

据我所知,应该可以。但我更喜欢明确的 timestampOffset接近我自己,因为它在想要将段追加到缓冲区中很远的地方时提供了更大的灵 active (即,如果用户在当前缓冲区末尾之前寻找方式,您将希望在间隙之后开始加载+追加)。虽然我很欣赏在您的用例中寻求我不是必需的。

关于html - MediaSource API - 将多个视频附加/连接到一个缓冲区中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35019746/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com