`我想要一个功能,如果我按下倒带按钮,我应该在快倒模式下听到音频,就像我们在快进模式下听到音频一样。 我有一个 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);
您的代码不正确,因为您填写了
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;
}