Кодировать аудио обратно из getChannelData()

Я вызываю getChannelData и выполняю некоторые действия и удаляю значения из Float32Array.

Как я могу закодировать эти данные обратно в форму, которую можно сохранить?

const blob = new Blob(this.chunks, { type: audioType });
// generate audio url from blob
const audioContext = new (window.AudioContext ||
  window.webkitAudioContext)();
// reading the file with file reader using a method that uses read file in a promise 
ReadFile(blob).then((arrayBuffer) => {
  audioContext.decodeAudioData(arrayBuffer).then((audioBuffer) => {
    const audioBufferSourceNode = audioContext.createBufferSource();
    const numChannels = audioBuffer.numberOfChannels;
    const leftChannelArray = audioBuffer.getChannelData(0);
    // audioBufferSourceNode.buffer = leftChannelArray;
    let rightChannelArray;
    if (numChannels>1) {
      rightChannelArray = audioBuffer.getChannelData(1);
    }
    const monoChannelTrimmed = trimSilence(leftChannelArray, rightChannelArray) //we look on both sides for silence, we delete the array values and merge the channels
    //Now i want to turn monoChannelTrimmed into a usable audio file

Превратить этот канал во что-то полезное — вот с чем я боролся. Я пробовал некоторые предложения из других вопросов в этой области, таких как Преобразование Float32Array в Uint8Array с сохранением представления IEEE 754 Но ничего не сработало, если у кого-то есть предложения, я бы очень хотел их попробовать.


person WorkingOnBeingBetter    schedule 30.09.2020    source источник
comment
Что за игровая форма? WebAudio может воспроизводить данные в getChannelData как есть (примерно).   -  person Raymond Toy    schedule 30.09.2020
comment
Я хочу сохранить аудио в формате wav, чтобы его можно было использовать в элементе «аудио».   -  person WorkingOnBeingBetter    schedule 01.10.2020
comment
Это кажется обходным путем, поскольку вы уже можете воспроизвести его с помощью WebAudio. Вы пытаетесь закодировать звук и отправить его на сервер, чтобы его можно было воспроизвести в другом месте с помощью тега «аудио»?   -  person Raymond Toy    schedule 01.10.2020
comment
Да, я пытаюсь сохранить эти файлы на сервер. Я не могу сделать это с информацией из getChannelData(), я заметил, что постоянно в значениях есть много ведущих 0, которые могут иметь какое-то отношение к тому, как это кодируется. Я согласен с тем, что мой предыдущий комментарий был довольно окольным, поэтому я ценю ваше понимание моего намерения.   -  person WorkingOnBeingBetter    schedule 01.10.2020
comment
Пожалуйста, обновите свой вопрос, указав более подробную информацию.   -  person Raymond Toy    schedule 01.10.2020
comment
Я обновил вопрос, спасибо за терпение   -  person WorkingOnBeingBetter    schedule 01.10.2020


Ответы (1)


Вероятно, вы можете использовать API записи MediaStream.

Вот небольшой фрагмент того, как его использовать, в основном взятый из примера, но измененный для использования WebAudio OscillatorNode в качестве источника. Вы можете заменить его на AudioBufferSourceNode, который воспроизводит ваш monoTrimmedChannel.

let c;
let s;
let d;
let mediaRecorder;

let recordedChunks = [];

function handleDataAvailable(event) {
  console.log("data-available");
  if (event.data.size > 0) {
    recordedChunks.push(event.data);
    download();
  } else {
    // ...
  }
}

function download() {
  let blob = new Blob(recordedChunks, {
    type: "video/webm"
  });
  let url = URL.createObjectURL(blob);
  let a = document.createElement("a");
  document.body.appendChild(a);
  a.style = "display: none";
  a.href = url;
  a.download = "test.mp3";
  a.click();
  window.URL.revokeObjectURL(url);
}

setTimeout(event => {
  console.log("stopping");
  mediaRecorder.stop();
}, 9000);

function start() {
  console.log("start");
  c = new AudioContext();
  s = new OscillatorNode(c);
  d = new MediaStreamAudioDestinationNode(c);
  s.connect(d);

  mediaRecorder =  new MediaRecorder(d.stream,  {
    mimeType:  "audio/webm"
  });
  mediaRecorder.ondataavailable = handleDataAvailable;

  s.start();
  mediaRecorder.start();
}

Я проверил это локально, и он создал файл test.webm, который, как и ожидалось, воспроизводит приятный тон осциллятора. Вы, вероятно, захотите настроить некоторые вещи.

person Raymond Toy    schedule 01.10.2020
comment
Хотя технически это работает, требуется, чтобы вы воспроизвели захваченный звук или видео. - person WorkingOnBeingBetter; 15.12.2020
comment
Я не знаю, что вы можете кодировать что-то без фактического воспроизведения в реальном времени или в автономном режиме каким-либо образом. Не понимаю, как можно что-то закодировать, не отправляя весь клип в кодировщик. Может быть, WebCodecs поможет вам? - person Raymond Toy; 16.12.2020