Getting number of audio channels for an AudioTrack

1.6k views Asked by At

I have a video element, with data being added via MSE. I'm trying to determine how many audio channels there are in each track.

The AudioTrack objects themselves don't have a property with this information. The only way I know to go about it is to use the 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;
}));

For a video with a single mono track, I expect to get [1]. For a video with a single stereo track, I expect to get [2]. Yet, every time I get [2] no matter what the channel count is in the original source.

Questions:

  • Is there a proper direct way to get the number of channels in an AudioTrack?
  • Is there something else I could be doing with the Web Audio API to get the correct number of channels?
1

There are 1 answers

0
souporserious On

I stumbled upon an answer for this that seems to be working. It looks like by using decodeAudioData we can grab some buffer data about a file. I built a little function that returns a Promise with the buffer data that should return the correct number of channels of an audio file:

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)
          )
        )
    )
}

Then you can use it like this:

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

Might be best to store and reuse the data if it can be called multiple times.