gpt4 book ai didi

javascript - HTML 5 视频 : Playing multiple "clips" with javascript

转载 作者:行者123 更新时间:2023-12-03 00:32:12 28 4
gpt4 key购买 nike

我在使用 HTML 视频和 JavaScript 时遇到问题,因此编写了一些简单的代码来演示。有一个视频包含三个“剪辑”,全长五秒(显然,在现实世界中,它们要长得多)。一个在 25 - 30 秒,一个在 55 - 60 秒,最后一个在 85 - 90 秒。我希望用户能够单击每五秒剪辑的相关按钮。

有两个问题:

  1. Chrome currenttimer() 错误似乎不允许您更改外部视频的开始时间(视频将存储在 Azure Blob 上)。似乎有很多关于此问题的帖子,但没有解决。
  2. 当您播放第一个剪辑,然后尝试播放第二个剪辑时,由于剪辑 2 的开始时间晚于剪辑 1 的结束时间,因此不会播放,因为 AddEventListener 仍然有效。有没有办法删除原来的Ev​​entListener或用新的结束时间替换它?

这是正在使用的代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<div style="width: 700px; height: 400px; margin: auto; text-align: center;">
<video id="video1" width="620" controls>
<source type="video/mp4" src="external video link here" />
Your browser does not support HTML5 video.
</video>

<input type="button" value="Play Clip 1 (25 - 30 seconds" onclick="javascript: showvid(25);" /><br />
<input type="button" value="Play Clip 2 (55 - 60 seconds" onclick="javascript: showvid(55);" /><br />
<input type="button" value="Play Clip 3 (85 - 90 seconds" onclick="javascript: showvid(85);" /><br />
</div>

<script type="text/javascript">
function showvid(timer) {
var myVideo = document.getElementById("video1");
myVideo.currentTime = timer;
myVideo.play();

myVideo.addEventListener("timeupdate", function () {
if (this.currentTime >= (timer + 5)) {
this.pause();
}
});
}
</script>
</body>
</html>

更新1

我已更改事件监听器检查,仅当当前时间在结束时间的一秒内时才暂停视频。因此,如果下一个剪辑距离超过一秒,听众将不会在剪辑开始之前停止该剪辑。

仍在调查 Chrome 问题。

最佳答案

我不知道您在谈论什么 Chrome 错误,但为了更清晰的代码,您可能会对 #t=start[,end] Media Fragment 感兴趣,这将允许您直接设置时间范围作为 的来源:

onclick =e=> {
const data = e.target.dataset;
if(!data.start) return;
vid.src = vid.src.split('#')[0] +
'#t=' + data.start + ',' + data.end;
// url.vid#t=start,end
vid.play();
}
<button data-start="5" data-end="10">play [5,10]</button>
<button data-start="35" data-end="40">play [35,40]</button>
<button data-start="00:01:25" data-end="00:01:30">play [00:01:25,00:01:30]</button>
<video id="vid" src="https://upload.wikimedia.org/wikipedia/commons/transcoded/2/22/Volcano_Lava_Sample.webm/Volcano_Lava_Sample.webm.360p.webm" muted></video>

<小时/>

现在,如果您确实希望按照原来的方式进行,那么您需要稍微更改一下代码。

切勿从用户生成的事件添加新的事件监听器。

添加一次,仅从用户事件触发信号量/更新变量。

因此,我们首先在 上添加 timeupdate 事件,然后如果没有发生用户生成的事件,我们会提前退出。否则,我们会检查两个事件监听器都可以访问的变量(此处称为 next_stop)是否应该暂停。

然后,在按钮事件监听器中,我们更新 currentTime,请求它播放并更新next_stop

由于共享 next_stop 变量,两个事件监听器可以进行交互,但不会再发生冲突。

let next_stop = Infinity; // a variable shared by both event listeners

// add the event listeners only once
vid.addEventListener('timeupdate', handleTimeupdate, {passive: true});
document.addEventListener('click', handleClick);

function handleTimeupdate(evt) {
// not set? exit early
if(!isFinite(next_stop)) return;
// a single action
if(this.currentTime > next_stop) {
this.pause();
// if you want to disable the range once it's done
// e.g to allow default controls interactions
// next_stop = Infinity;
}
}

function handleClick(evt) {
const times = parseTime(evt.target);
if(!times) return;
// update the video's current time
vid.currentTime = times.start;
// update the shared variable
next_stop = times.end;
// start playing if needed
if(vid.paused) {
vid.play();
}
}

function parseTime(target) {
const data = target.dataset;
if(!data || !data.start) return null;
return {start: +data.start, end: +data.end};
}
<button data-start="5" data-end="10">play [5,10]</button>
<button data-start="35" data-end="40">play [35,40]</button>
<button data-start="85" data-end="90">play [00:01:25,00:01:30]</button>
<video id="vid" src="https://upload.wikimedia.org/wikipedia/commons/transcoded/2/22/Volcano_Lava_Sample.webm/Volcano_Lava_Sample.webm.360p.webm" controls></video>

关于javascript - HTML 5 视频 : Playing multiple "clips" with javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53811794/

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