I have a video tag in which I pass video data i.e src
and vtt
dynamically, I want to keep vtt for the current video only, and remove all other textTracks
.
Right Now on switching the video, all vtt related to previously played videos start playing inside the video tag.
vtt is subtitle
function addVttInvideo(data) {
// http://www.html5rocks.com/en/tutorials/track/basics/
// https://www.iandevlin.com/blog/2015/02/javascript/dynamically-adding-text-tracks-to-html5-video
var video = document.getElementById('videoSrc');
var track = video.addTextTrack('subtitles', 'English', 'en');
track.mode = "showing";
var startTime = parse_timestamp(data.info.start);
var endTime = parse_timestamp(data.info.end);
var cue = new VTTCue(startTime, endTime, data.info.text);
// track.addEventListener("cuechange", function () {
// // get current cue, and remove it if it's number 2
// var currentCue = track.activeCues[0];
// track.removeCue(currentCue)
// },false);
track.addCue(cue);
// console.log('subtitle.innerHTML',subtitle.innerHTML);
// quick_and_dirty_vtt_or_srt_parser(subtitle.innerHTML).map(function(cue) {
// track.addCue(cue);
// });
// track.addCue(quick_and_dirty_vtt_or_srt_parser(2,55,'my profile'));
}
function parse_timestamp(s) {
var match = s.match(/^(?:([0-9]{2,}):)?([0-5][0-9]):([0-5][0-9][.,][0-9]{0,3})/);
if (match == null) {
throw 'Invalid timestamp format: ' + s;
}
var hours = parseInt(match[1] || "0", 10);
var minutes = parseInt(match[2], 10);
var seconds = parseFloat(match[3].replace(',', '.'));
return seconds + 60 * minutes + 60 * 60 * hours;
}
} catch (e) {
console.log('the exception album ' + e);
}
// load video is called when user swipe next and back
function loadVideo(way) {
var videoSrc = $('#videoSrc');
if (way === 'prev') {
videoCounter = videoCounter - 1;
if (videoCounter < 0) videoCounter = VideoData.length - 1;
videoSrc.attr('src', VideoData[videoCounter].vurl);
videoSrc.attr('poster', VideoData[videoCounter].turl)
addVttInvideo(VideoData[videoCounter].vtt)
} else if (way === 'next') {
videoCounter = videoCounter + 1;
if (videoCounter > VideoData.length - 1) videoCounter = 0;
videoSrc.attr('src', VideoData[videoCounter].vurl);
videoSrc.attr('poster', VideoData[videoCounter].turl)
addVttInvideo(VideoData[videoCounter].vtt)
} else {
videoSrc.attr('src', VideoData[0].vurl);
videoSrc.attr('poster', VideoData[0].turl)
addVttInvideo(VideoData[0].vtt)
// document.getElementById('vsrc').onloadeddata = function() {
// debugger
//
// };
}
$("#videoAlbumCaption").text(videoCounter + 1 + " / " + VideoData.length);
}
A bit confusing as your question is for removing vtt cue, but from what you described is removing all other textTracks.
I will explain how to remove all other textTracks.
HTML
<video src="foo.ogv">
<track kind="subtitles" label="English subtitles" src="subtitles_en.vtt" srclang="en" default>
</track>
<track kind="subtitles" label="Deutsche Untertitel" src="subtitles_de.vtt" srclang="de">
</track>
</video>
videoElement.textTracks console output
var videoElement = document.querySelector("video");
console.log(videoElement);
TextTrackList {0: TextTrack, 1: TextTrack, length: 2, onchange: null, onaddtrack: null, onremovetrack: null}
0: TextTrack {kind: "subtitles", label: "English subtitles", language: "en", id: "", mode: "showing", …}
1: TextTrack {kind: "subtitles", label: "Deutsche Untertitel", language: "de", id: "", mode: "disabled", …}
length: 2
Remove Track
var videoElement = document.querySelector("video");
videoElement.removeChild(videoElement.children[0]); //remove English subtitle
// you need iterlate videoElement.textTracks and find index according to language
var i =0;
var targetLanguage = "de";
for (let track of videoElement.textTracks){
if(track.language !== targetLanguage){
videoElement.removeChild(videoElement.children[i]);
}
i++;
}
As @Heretic Monkey commented, please refer to this for TextTrackList Implementation. Delete a TextTrack from a video
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With