gpt4 book ai didi

javascript - 同步视频和音频(最好不用 JavaScript)

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:21 26 4
gpt4 key购买 nike

如果我有 HTML5 videoaudio 元素,是否有一种干净的方法可以使它们保持同步?它们应该像包含音轨的视频文件一样,因此手动推进一个音轨应该会带来另一个音轨。假设这两个音轨具有相同的持续时间。

我想要一个可以跨浏览器工作的解决方案,但我并不特别在意它是否可以在旧版浏览器上工作。如果可能的话,最好避免使用 JavaScript。否则,一个非常简单的 JavaScript 库将是最好的——它只询问要同步哪些轨道并处理其余部分。

我调查了 mediagroup ...但它看起来只适用于 Safari。我调查了audioTracks ...但用户必须在 Firefox 中启用该功能。

我调查了 Popcorn.js ,这是一个似乎专为这项任务设计的 JavaScript 框架......但看起来一年多来没有任何事件。除此之外,我能找到的唯一演示是将文本或幻灯片之类的东西同步到视频,而不是音频到视频。

最佳答案

您可以使用 Promise.all()fetch() 将媒体资源检索为 BlobURL.createObjectURL () 创建资源的 Blob URLcanplaythrough 事件和Array.prototype.every() 检查每个资源是否可以播放;当两个资源都可以播放时,在每个资源上调用 .play()

I didn't make it clear in the question. I meant that the two tracks should stay in sync as though playing a regular video file with audio.

一种方法是创建一个时间戳变量,利用seeked事件在设置变量大于最小延迟时更新元素的.currentTime以防止 .currentTime 被递归调用。

<!DOCTYPE html>
<html>
<head>
</head>
<body>
<button>load media</button>
<br>
<div id="loading" style="display:none;">loading media...</div>
<script>
var mediaBlobs = [];
var mediaTypes = [];
var mediaLoaded = [];
var button = document.querySelector("button");
var loading = document.getElementById("loading");
var curr = void 0;
var loadMedia = () => {
loading.style.display = "block";
button.setAttribute("disabled", "disabled");
return Promise.all([
// `RETURN` by smiling cynic are licensed under a Creative Commons Attribution 3.0 Unported License
fetch("https://ia600305.us.archive.org/30/items/return_201605/return.mp3")
, fetch("http://nickdesaulniers.github.io/netfix/demo/frag_bunny.mp4")
])
.then(responses => responses.map(media => ({
[media.headers.get("Content-Type").split("/")[0]]: media.blob()
})))
.then(data => {
for (var currentMedia = 0; currentMedia < data.length; currentMedia++) {
(function(i) {
var type = Object.keys(data[i])[0];
mediaTypes.push(type);
console.log(data[i]);
var mediaElement = document.createElement(type);
mediaElement.id = type;
var label = document.createElement("label");
mediaElement.setAttribute("controls", "controls");
mediaElement.oncanplaythrough = () => {
mediaLoaded.push(true);
if (mediaLoaded.length === data.length
&& mediaLoaded.every(Boolean)) {
loading.style.display = "none";
for (var track = 0; track < mediaTypes.length; track++) {
document.getElementById(mediaTypes[track]).play();
console.log(document.getElementById(mediaTypes[track]));
}
}
}
var seek = (e) => {
if (!curr || new Date().getTime() - curr > 20) {
document.getElementById(
mediaTypes.filter(id => id !== e.target.id)[0]
).currentTime = e.target.currentTime;
curr = new Date().getTime();
}
}
mediaElement.onseeked = seek;
mediaElement.onended = () => {
for (var track = 0; track < mediaTypes.length; track++) {
document.getElementById(mediaTypes[track]).pause()
}
}
mediaElement.ontimeupdate = (e) => {
e.target.previousElementSibling
.innerHTML = `${mediaTypes[i]} currentTime: ${Math.round(e.target.currentTime)}<br>`;
}
data[i][type].then(blob => {
mediaBlobs.push(URL.createObjectURL(blob));
mediaElement.src = mediaBlobs[mediaBlobs.length - 1];
document.body.appendChild(mediaElement);
document.body.insertBefore(label, mediaElement);
})
}(currentMedia));
}
})
};
button.addEventListener("click", loadMedia);
</script>
</body>
</html>

plnkr http://plnkr.co/edit/r51oh7KsZv8DEYhpRJlL?p=preview

关于javascript - 同步视频和音频(最好不用 JavaScript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39046644/

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