【问题标题】:Getting number of audio channels for an AudioTrack获取 AudioTrack 的音频通道数
【发布时间】:2017-09-15 18:33:28
【问题描述】:

我有一个视频元素,其中的数据是通过 MSE 添加的。我正在尝试确定每个轨道中有多少个音频通道。

AudioTrack 对象本身没有包含此信息的属性。我知道的唯一方法是使用 Web Audio API:

const v = document.querySelector('video');
const ctx = new OfflineAudioContext(32, 48000, 48000);
console.log(Array.from(v.audioTracks).map((track) => {
  return ctx.createBufferSource(track.sourceBuffer).channelCount;
}));

对于带有单声道的视频,我希望得到[1]。对于具有单个立体声轨道的视频,我希望得到[2]。然而,每次我收到[2] 时,无论原始来源中的频道数是多少。

问题:

  • 是否有适当的直接方法来获取 AudioTrack 中的通道数?
  • 我还可以使用 Web Audio API 做些什么来获得正确数量的通道吗?

【问题讨论】:

  • 我认为在单声道上两个通道是一样的,对吧?
  • @KilianHertel 是的,但这并没有告诉我任何有关底层频道数的信息。我可以对音频进行采样,它可能是单声道的,然后是立体声的。即使在两个频道一直相同的情况下,如果有两个频道,我仍然想报告有两个频道。
  • 那么你为什么不把每个频道的第一部分拿来相互比较呢?如果它们相同,则它们是单声道,否则它们是立体声。例如 myArrayBuffer.getChannelData(channel);换句话说,您必须自己制作一个不容易的方法,但这是可能的。
  • 单声道总是在两个声道上运行,否则您将听不到两个扬声器上的音乐。
  • 正如我所说,我想检测媒体数据中的实际频道数。比较它们并不能告诉我任何事情。我可以有两个相同的通道,比较会告诉我它是单声道的,但底层源实际上是立体声。

标签: javascript audio web-audio-api media-source


【解决方案1】:

我偶然发现了一个似乎有效的答案。看起来通过使用decodeAudioData,我们可以获取一些关于文件的缓冲区数据。我构建了一个小函数,它返回一个带有缓冲区数据的 Promise,该缓冲区数据应该返回音频文件的正确通道数:

function loadBuffer(path) {
  return fetch(path)
    .then(response => response.arrayBuffer())
    .then(
      buffer =>
        new Promise((resolve, reject) =>
          audioContext.decodeAudioData(
            buffer,
            data => resolve(data),
            err => reject(err)
          )
        )
    )
}

那么你可以这样使用它:

loadBuffer(audioSource).then(data => console.log(data.numberOfChannels))

如果可以多次调用,最好存储和重用数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    相关资源
    最近更新 更多