作者:fuvogsda99363818 | 来源:互联网 | 2023-09-24 20:36
我使用<video>在网页中嵌入了DASH视频标签.此内容有多个音轨.我想支持音轨改变.我使用audioTracks[i].enable功能来选择音轨.但是音轨没有
我使用
if (selected == i) {
audioTracks[i].enable = TRUE;
}
>这是正确的方法吗?
>还有其他方法可以更改DASH(.mpd)内容的音轨吗?
通过音轨改变,我的意思是发起可以传播到较低级别的音轨改变事件.不要自己实现轨道更改.
我进一步试过,
audioLanguage和lang属性的视频标签为
&#160;document.getElementById(id).lang = selectedIndex;
和
document.getElementById(id).audioLanguage = selectedIndex;
即使这似乎不起作用.
更清楚一点,如@Svenskunganka回答中提到的audioTracks [i] .enable = TRUE;在使用的版本中不支持铬.
那么,有没有其他方法可以做到audioTracks [i] .enable = TRUE.
我不想实现跟踪更改功能.这里的要求是仅指示对浏览器的跟踪更改.
编辑:
正如我们在https://www.w3schools.com/tags/av_prop_audiotracks.asp中看到的那样.chrome中不支持此属性.那么什么是表明必须改变轨道的替代方式?
还有其他办法吗?或者audioTrack是唯一的方法(据我所知,从目前为止)?
解决方法:
您可以使用fetch()或XMLHttpRequest()来请求.mpd文件,使用.text()或.responseText将application / dash xml响应作为文本读取,将文本传递给DOMParser()实例.parseFromString()以创建#文档,迭代document.documentElement Period元素的AdaptationSet子节点,使用.querySelector()获取Representation子节点然后获取Representation的BaseURL子节点,其中URL为.textContent,其路径为,至少在引用的文件中为文件在同一目录.
我们也可以选择视频URL,使用Promise.all()加载和播放视频和音频轨道,以便能够调用HTMLMediaElement.captureStream(),我们.clone()并传递给Promise构造函数的resolve(),at链接.then()在每个轨道的MediaStream()实例上调用.addTrack(),然后设置
const video = document.querySelector("video");
const mediaStream = new MediaStream();
const url = "https://dash.akamaized.net/dash264/TestCases/10a/1/"
const mpd = "iis_forest_short_poem_multi_lang_480p_single_adapt_aaclc_sidx.mpd";
const avc = [];
video.Oncanplay= video.play;
fetch(`${url}${mpd}`)
.then(respOnse=> response.text())
.then(text => {
const parser = new DOMParser();
const xml = parser.parseFromString(text, "application/xml");
const period = xml.documentElement;
const tracks = period.querySelectorAll("AdaptationSet");
for (let track of tracks) {
const representation = track.querySelector("Representation");
const {textContent:currentTrack} = representation.querySelector("BaseURL");
console.log(currentTrack);
// filter for specific track here, for example
// where "english" is included within `.textContent` of node
if (/english/i.test(currentTrack) || /avc/.test(currentTrack)) {
avc.push(`${url}${currentTrack}`);
}
}
Promise.all(avc.map(media => {
return new Promise(resolve => {
let v = document.createElement("video");
v.src = media;
v.volume = 0.5;
v.muted = true;
v.Oncanplay= () => {
v.play();
resolve({
currentMedia:v
, stream:v.captureStream().clone().getTracks()[0]
})
}
})
}))
.then(tracks_ => {
for (let {stream, currentMedia} of tracks_) {
mediaStream.addTrack(stream);
currentMedia.muted = false;
}
video.srcObject = mediaStream;
})
})