Получение количества аудиоканалов для AudioTrack

У меня есть элемент видео, данные добавляются через MSE. Я пытаюсь определить, сколько аудиоканалов в каждой дорожке.

Сами объекты AudioTrack не имеют свойства с этой информацией. Единственный известный мне способ сделать это — использовать 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?
  • Есть ли что-то еще, что я мог бы сделать с API веб-аудио, чтобы получить правильное количество каналов?

person Brad    schedule 15.09.2017    source источник
comment
Я думаю, что в моно оба канала одинаковы, верно?   -  person Kilian Hertel    schedule 28.11.2017
comment
@KilianHertel Да, но это ничего не говорит мне о количестве базовых каналов. Я мог сэмплировать звук, и в один момент он мог быть моно, а в следующий — стерео. Даже в случае, когда оба канала были идентичны все время, я все равно хотел бы сообщить, что есть два канала, если есть два канала.   -  person Brad    schedule 28.11.2017
comment
Так почему бы вам не взять первую часть каждого канала и не сравнить их друг с другом? Если они одинаковые, то моно, если нет, то стерео. Например, с myArrayBuffer.getChannelData(channel); Другими словами, нет простого способа сделать его самостоятельно, но это возможно.   -  person Kilian Hertel    schedule 28.11.2017
comment
И моно работает всегда на двух каналах, иначе вы бы не слышали музыку на обоих динамиках.   -  person Kilian Hertel    schedule 28.11.2017
comment
Как я уже сказал, я хочу определить фактическое количество каналов в медиаданных. Их сравнение мне ни о чем не говорит. У меня могло бы быть два идентичных канала, и сравнение показало бы мне, что это моно, но основной источник на самом деле был бы стереофоническим.   -  person Brad    schedule 28.11.2017
comment
Что ты имеешь в виду? Аппаратно всегда стерео! Моно - это то, как он был записан, каналов всегда два, так что в аппаратном обеспечении нет моно, хорошо? Источник всегда стерео, потому что мы хотим слышать музыку на двух каналах => Левый и Правый. Если канал 1 = канал 2, это то, что мы бы назвали монофоническим => правый динамик дает тот же сигнал, что и левый динамик.   -  person Kilian Hertel    schedule 28.11.2017
comment
Это количество аппаратных каналов для каждого динамика. 1 слева 1 справа = два всегда. если количество каналов равно единице, сигнал будет только на один динамик. Никто не хотел бы это слышать. Представьте, что у вас есть наушники, и вы слышите только правый динамик, если он монофонический => было бы странно, не так ли?   -  person Kilian Hertel    schedule 28.11.2017
comment
@KilianHertel Очевидно, вы не понимаете, что я пытаюсь сделать. Я пытаюсь определить, что находится в исходных данных мультимедиа. Совершенно не важно, какое отображение каналов на выходе. На самом деле, я мог бы даже не играть в этот выход. И нет, источник не всегда стерео, и оборудование не всегда стерео.   -  person Brad    schedule 28.11.2017


Ответы (1)


Я наткнулся на ответ, который, кажется, работает. Похоже, что с помощью decodeAudioData мы можем получить некоторые буферизовать данные о файле. Я создал небольшую функцию, которая возвращает обещание с данными буфера, которые должны возвращать правильное количество каналов аудиофайла:

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

Лучше всего хранить и повторно использовать данные, если их можно вызывать несколько раз.

person souporserious    schedule 14.08.2018