【问题标题】:How to Enable audio track change in <video> tag for DASH content?如何在 DASH 内容的 <video> 标签中启用音轨更改?
【发布时间】:2017-08-08 05:37:07
【问题描述】:

我使用&lt;video&gt; 标签在网页中嵌入了 DASH 视频。此内容有多个音轨。我想支持音轨更改。
我使用audioTracks[i].enable 功能来选择音轨。但是音轨没有改变。

if (selected == i) {
    audioTracks[i].enable = TRUE;
}
  1. 这是正确的方法吗?
  2. 还有其他方法可以更改 DASH(.mpd) 内容的音轨吗?

通过音轨更改,我的意思是启动可以传播到较低级别的音轨更改事件。不实施轨道变更本身。

我进一步尝试了,
video标签的audioLanguage和lang属性as
document.getElementById(id).lang = selectedIndex;

document.getElementById(id).audioLanguage = selectedIndex;
即使这似乎不起作用。

为了更清楚,正如@Svenskunganka audioTracks[i].enable=TRUE; 的回答中所提到的,在所使用的版本中不支持铬。
那么,有没有其他方法可以做audioTracks[i].enable=TRUE 所做的事情。
我不想实现跟踪更改功能。此处的要求是仅向浏览器指示音轨更改。

EDIT:
正如我们在https://www.w3schools.com/tags/av_prop_audiotracks.asp 中看到的那样。 chrome 不支持此属性。那么指示必须更改轨道的替代方法是什么?
有没有别的办法。。还是 audioTrack 是唯一的方法(到目前为止我从搜索中了解到)?

【问题讨论】:

  • “音轨变化”是什么意思?您是否在编码期间提供了曲目的名称?
  • @guest271314 我正在尝试玩dash.akamaized.net/dash264/TestCases/10a/1/…。此内容具有多种音频语言支持。因此,为了在这里更改音频语言,我正在使用 audioTracks[i].enable
  • 可以解析application/dash+xmldocument,看帖子
  • 不清楚是什么要求?
  • 换个说法,Requirement是audioTracks[i].enable的替代品

标签: javascript html html5-video chromium mpeg-dash


【解决方案1】:

您可以使用fetch()XMLHttpRequest() 请求.mpd 文件,使用.text().responseTextapplication/dash+xml 响应作为文本读取,将文本传递给DOMParser() 实例.parseFromString() 以创建一个#document,迭代document.documentElementPeriod元素的AdaptationSet子节点,使用.querySelector()得到Representation子节点,然后得到BaseURLRepresentation的子节点,其中URL为.textContent至少在引用的文件中具有指向同一目录中的文件的路径。

我们还可以选择视频 URL,使用 Promise.all() 加载和播放视频和音频轨道,以便能够调用 HTMLMediaElement.captureStream(),我们将 .clone() 传递给 Promise 构造函数的 resolve(),在在每个轨道的 MediaStream() 实例上链接 .then() 调用 .addTrack(),然后将 &lt;video&gt; .srcObject 设置为包含音频和视频轨道的 MediaStream

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;
  })
})
&lt;video controls&gt;&lt;/video&gt;

【讨论】:

  • 谢谢。据我了解,这明确地将音频文件链接设置为视频标签的 src。如果是这样,那么就像实施轨道变更一样。但我不想这样做。我需要启动一个轨道更改事件。这对于所有 DASH 内容来说都是通用的。甚至可能适用于 HLS。这似乎将音频文件设置为视频标签的 src 对吗?如果是这样可以吗?因为音频和视频是 mpd 中的 2 个独立文件。
  • 该方法捕获.mpd 文件中列出的文件的流,然后将每个流的MediaStreamTrack 添加到单个MediaStream 中,该MediaStream 设置在单个&lt;video&gt; 对象中。我们也可以使用第一个媒体元素的流来添加第二个流。是的,音频可以在&lt;video&gt; 元素上播放。尚未阅读HTMLMediaElement 的“跟踪更改事件”的任何文档,但这并不意味着该功能不存在。 .mpd 文件仅用于为解决方法提供离散音频和视频文件的路径。我们实现了自己的流。
  • 好的。是的,那么此方法将自行实现轨道更改。但我只需要生成/启动一个轨道更改事件。不管怎么说,还是要谢谢你。有一个疑问,我是用这种方法来到这里的,然后会有 2 个视频元素。一个播放音频,另一个播放视频对吗?
  • 创建视频元素以捕获流。我们在单个视频元素上播放流。虽然,是的,每个媒体资源实际上是在两个HTMLMediaElements 上播放,在单个视频元素上呈现在屏幕上。该方法是一种解决方法,因为.mpd 文件在 chromium 59 上尝试时不会呈现播放;尝试在浏览器地址字段请求.mpd文件时,浏览器会提示下载文件。
  • 注意问题包含文本"2. 有没有其他方法可以改变DASH(.mpd) 内容的音轨?"
【解决方案2】:

音轨 API 尚未完全跨浏览器实现。见caniuse for Audio Track。您的问题很可能是您使用 Chrome 或 Firefox 来测试它。

Chrome has implemented it,但尚未宣布何时登陆。
它在 Firefox 33 中实现,但默认情况下未启用,必须通过用户偏好进行切换。 Gecko 似乎也存在一些问题,无法执行多轨播放,这就是为什么这个功能被禁用了这么长时间(在撰写本文时,Firefox 的版本为 57)。

【讨论】:

  • 谢谢。好的,我正在使用铬。它还不支持音轨。有没有其他方法可以用于支持音轨更改?我的意思是不使用 audioTrack ?
  • @LearningC 我不完全确定,但有一个名为 BitMovin 的产品似乎有 solved that issue specifically for MPEG-DASH。问题是their player's JavaScript code 被严重混淆,因此很难在不反转混淆的情况下找出他们是如何解决它的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
相关资源
最近更新 更多