在 JavaScript/Angular 中反转音频

问题描述 投票:0回答:1

`我想要一个功能,如果我按下倒带按钮,我应该在快倒模式下听到音频,就像我们在快进模式下听到音频一样。 我有一个 AudioBuffer,我正在反转它,但是当我播放它时,我在快退模式下听不到任何声音,但在快进模式下我能够听到音频。

这里是根据flag来倒放和前进播放音频的逻辑。

private gainNode: GainNode = {} as GainNode;
    private aCtx = new AudioContext({ sampleRate: 16000 });
    private source?: AudioBufferSourceNode;
if (this.source) {
            this.source = this.aCtx.createBufferSource();
            let bufferToPlay = this.speechAudioBufferService.getModifyedBuffer;

            if (this.speechAudioBufferService.getModifyedBuffer && this.fastRewind) {
                const actualBuffer = this.speechAudioBufferService.getModifyedBuffer;
                const channels = actualBuffer.numberOfChannels;
                const length = actualBuffer.length;
                const reversedBuffer = this.aCtx.createBuffer(channels, length, actualBuffer.sampleRate);

                for (let channel = 0; channel < channels; channel++) {
                    const originalData = actualBuffer.getChannelData(channel);
                    const reversedData = reversedBuffer.getChannelData(channel);
                    for (let i = 0; i < length; i++) {
                        reversedData[i] = originalData[length - i - 1];
                    }
                }
                bufferToPlay?.copyFromChannel(reversedBuffer.getChannelData(0), 0);
            }

            if (bufferToPlay) {
                this.source.buffer = bufferToPlay;
            }
            this.source.playbackRate.value = this.playRate();
            this.source.connect(this.gainNode).connect(this.aCtx.destination);
            this.source.start(0, this.positionAndDurationService.currentPosition);
javascript audio buffer html5-audio web-audio-api
1个回答
0
投票

您的代码不正确,因为您填写了

reversedData
但从未将该数据放回
reversedBuffer
:

const originalData = actualBuffer.getChannelData(channel);
const reversedData = reversedBuffer.getChannelData(channel);

for (let i = 0; i < length; i++) {
  reversedData[i] = originalData[length - i - 1];
}

reversedData
现在去哪儿了?无处。所以,当你跑步时:

bufferToPlay?.copyFromChannel(reversedBuffer.getChannelData(0), 0);

您只是将一个通道从空缓冲区 (

reversedBuffer
) 复制到
bufferToPlay

这里有一个更简单的方法,复制所有通道并使用

Float32Array
及其
.revese()
方法:

if (this.speechAudioBufferService.getModifyedBuffer && this.fastRewind) {
  const {
    numberOfChannels,
    length,
    sampleRate,
  } = bufferToPlay.numberOfChannels;

  const reversedBuffer = this.aCtx.createBuffer(
    numberOfChannels,
    length,
    sampleRate,
  );

  for (let channel = 0; channel < numberOfChannels; ++channel) {
    const reversedSamples = bufferToPlay.getChannelData(channel).reverse();

    reversedBuffer.copyToChannel(reversedSamples, channel);
  }

  bufferToPlay = reversedBuffer;
}
© www.soinside.com 2019 - 2024. All rights reserved.