同步视频和音频(最好不使用JavaScript)
如果我有HTML5同步视频和音频(最好不使用JavaScript),javascript,html,audio,video,Javascript,Html,Audio,Video,如果我有HTML5video和audio元素,有没有干净的方法来保持它们的同步?它们的行为应该类似于包含音频曲目的视频文件,因此手动推进一个曲目时,另一个曲目也会随之移动。假设这两个音轨的持续时间相同 我想要一个跨浏览器的解决方案,但我并不特别关心它是否能在较旧的浏览器上工作。如果可能的话,最好避免使用JavaScript。否则,一个死气沉沉的简单JavaScript库将是最好的——它只要求同步哪些曲目并处理其余的曲目 我已经调查过。。。但它看起来只在狩猎中起作用。我已经调查过。。。但是用户必须
video
和audio
元素,有没有干净的方法来保持它们的同步?它们的行为应该类似于包含音频曲目的视频文件,因此手动推进一个曲目时,另一个曲目也会随之移动。假设这两个音轨的持续时间相同
我想要一个跨浏览器的解决方案,但我并不特别关心它是否能在较旧的浏览器上工作。如果可能的话,最好避免使用JavaScript。否则,一个死气沉沉的简单JavaScript库将是最好的——它只要求同步哪些曲目并处理其余的曲目
我已经调查过。。。但它看起来只在狩猎中起作用。我已经调查过。。。但是用户必须在Firefox中启用该功能
我已经研究了,这是一个JavaScript框架,似乎是为这个任务设计的。。。但看起来已经一年多没有任何活动了。除此之外,我能找到的唯一演示是将文本或幻灯片同步到视频,而不是音频到视频。据我所知,这在纯HTML中是不可能的
您可以使用
和事件的currentTime
属性连续重新同步视频和音频。您可以使用Promise.all()
,fetch()
将媒体资源检索为Blob
,URL.createObjectURL()
创建资源的Blob URL
canplay通过
事件和Array.prototype.each()
检查每个资源是否可以播放;当两个资源都可以播放时,对每个资源调用.play()
我在问题中没有说清楚。我的意思是这两条轨道
应该保持同步,就像播放常规视频文件和音频一样
一种方法是创建一个时间戳变量,当set变量大于最小延迟时,利用查找的
事件更新元素的.currentTime
,以防止递归调用.currentTime
加载媒体
正在加载媒体。。。
var mediaBlobs=[];
var mediaTypes=[];
var mediaLoaded=[];
var按钮=document.querySelector(“按钮”);
var加载=document.getElementById(“加载”);
var curr=void 0;
var loadMedia=()=>{
loading.style.display=“block”;
setAttribute(“禁用”、“禁用”);
回报你的承诺([
//微笑愤世嫉俗的“RETURN”是根据知识共享署名3.0未经授权的许可证进行授权的
取回(“https://ia600305.us.archive.org/30/items/return_201605/return.mp3")
,获取(“http://nickdesaulniers.github.io/netfix/demo/frag_bunny.mp4")
])
.then(responses=>responses.map(media=>({
[media.headers.get(“内容类型”).split(“/”[0]]:media.blob()
})))
。然后(数据=>{
对于(var currentMedia=0;currentMedia{
mediaLoaded.push(true);
如果(mediaLoaded.length==data.length
&&mediaLoaded.every(布尔值)){
load.style.display=“无”;
对于(var track=0;track{
如果(!curr | | new Date().getTime()-curr>20){
document.getElementById(
mediaTypes.filter(id=>id!==e.target.id)[0]
).currentTime=e.target.currentTime;
curr=新日期().getTime();
}
}
mediaElement.onSeek=seek;
mediaElement.OneNoded=()=>{
对于(var track=0;track{
e、 target.previousElementSibling
.innerHTML=`${mediaTypes[i]}currentTime:${Math.round(e.target.currentTime)}
`;
}
数据[i][type],然后(blob=>{
push(URL.createObjectURL(blob));
mediaElement.src=mediaBlobs[mediaBlobs.length-1];
document.body.appendChild(mediaElement);
document.body.insertBefore(标签、mediaElement);
})
}(媒体),;
}
})
};
按钮。addEventListener(“单击”,加载媒体);
是否可以在外部程序中预先将音频添加到视频中?这将是同步这两个元素的最可靠的方法。“没有JavaScript”,我想说这是不可能的,但您基本上需要监听这两个元素上的缓冲区事件,并阻止它们。然后,在加载足够的数据后继续播放。重复。@Glen Despaux我也希望避免这种情况……你可能会问太多关于HTML自己能做什么的问题,那么…@Glen Despaux是对的,HTML处理的是文档的结构而不是它的行为。我认为这种方法不太管用。。。看看这个演示的源代码,看起来时间只同步了一次。如果使用timeupdate
事件持续地重新同步它们,效果可能会更好