【问题标题】:Uncaught (in promise) DOMException: Unable to decode audio data from pyAudio to JavaScriptUncaught (in promise) DOMException: Unable to decode audio data from pyAudio to JavaScript
【发布时间】:2020-06-04 15:09:49
【问题描述】:

我有一个 python 应用程序,它从麦克风获取音频,将其发送到服务器,然后服务器将其发送到 javascript 应用程序。

我查了一下,python应用发送的数据和javascript接收的数据是一样的。

在控制台的 javascript 应用程序中,会出现以下消息:Uncaught (in promise) DOMException: Unable to decode audio data

我认为问题是因为发送的数据是原始数据,没有“.wav”标头,但我也尝试使用 wave 将数据写入文件并读取它,出现同样的错误。

使用 websockets 以二进制数据的形式发送/接收数据。

Python 代码:

# self data in init
self.sampleRate = 44100
self.duration = 1 / 30
self.channels = 2
self.chunk = 1024
self.format = pyaudio.paInt16

# code
pyAudio = pyaudio.PyAudio()
frames = []
stream = pyAudio.open(
    format=self.format,
    channels=self.channels,
    rate=self.sampleRate,
    input=True,
    output=True,
    frames_per_buffer=self.chunk
)

data = stream.read(int(44100 / self.chunk * self.duration))
frames.append(data)
recording = data

stream.stop_stream()
stream.close()
pyAudio.terminate()
  1. 录制数据是发送到 javascript 应用程序的数据。
  2. 我知道我应该记录多个帧,但我这样做是因为它更易于测试。

JavaScript 代码:

function playByteArray(byteArray) {
    var arrayBuffer = new ArrayBuffer(byteArray.length);
    var bufferView = new Uint8Array(arrayBuffer);
    for (i = 0; i < byteArray.length; i++) {
      bufferView[i] = byteArray[i];
    }
    context.decodeAudioData(arrayBuffer, function(buffer) {
        buf = buffer;
        play();
    });
}

function play() {
    var source = context.createBufferSource();
    source.buffer = buf;
    source.connect(context.destination);
    source.start(0);
}

我也尝试过使用 sounddevice python 模块,但我得到了同样的错误(正常方法,我无法让 Stream 回调方法工作)。

谢谢。

【问题讨论】:

    标签: javascript python pyaudio


    【解决方案1】:

    我解决了它,将playByteArray 更改为以下函数:

    function playByteArray(byteArray) {
        audio = new Audio();
        var blob = new Blob([byteArray], { type: 'audio/wav; codecs=0' });
        var url = window.URL.createObjectURL(blob);     
        audio.src = url;
        audio.oncanplaythrough = (event) => {
            var playedPromise = audio.play();
            if (playedPromise) {
                playedPromise.catch((e) => {
                    console.log(e);
                    if (e.name === 'NotAllowedError' || e.name === 'NotSupportedError') {
                        console.log(e.name);
                    }
                }).then(() => {
    
                });
            }
        };
    }
    

    【讨论】:

      猜你喜欢
      • 2021-01-03
      • 2021-05-16
      • 2018-01-27
      • 1970-01-01
      • 2021-11-05
      • 2022-12-19
      • 2021-01-30
      • 2018-04-03
      • 2020-07-10
      相关资源
      最近更新 更多