使用Flask将音频从pyaudio传输到HTML5

问题描述 投票:4回答:4

我想通过Flask将我的麦克风(通过pyaudio录制)的音频流传输到任何连接的客户端。

这是音频的来源:

    def getSound(self):
        # Current chunk of audio data
        data = self.stream.read(self.CHUNK)
        self.frames.append(data)
        wave = self.save(list(self.frames))

        return data

这是我的烧瓶代码:

@app.route('/audiofeed')
def audiofeed():
    def gen(microphone):
        while True:
            sound = microphone.getSound()
            #with open('tmp.wav', 'rb') as myfile:
            #   yield myfile.read()

            yield sound

    return Response(stream_with_context(gen(Microphone())))

这是客户:

    <audio controls>
        <source src="{{ url_for('audiofeed') }}" type="audio/x-wav;codec=pcm">
        Your browser does not support the audio element.
    </audio>

它有时会起作用,但大多数时候我会得到“[Errno 32] Broken pipe”

当用open(“tmp.wav”)取消注释时 - part(self.save()可选地获取所有先前的帧并将它们保存在tmp.wav中),我得到了一个流,但所有这些都来自扬声器是一个“点击” - 噪音。

我愿意接受任何建议。如何将我的麦克风实时流式传输(无预录制!)输入到网络浏览器?

谢谢!

python html5 audio flask pyaudio
4个回答
2
投票

很久以前就问过这个问题,但由于我花了一整天的时间来弄清楚如何实现这个问题,我想给出答案。也许对某人有帮助。

“[Errno 32] Broken pipe”错误来自客户端无法播放音频并关闭此流的事实。由于数据流中没有标题,因此无法播放音频。您可以使用代码genHeader(sampleRate, bitsPerSample, channels, samples)中的here函数轻松创建标题。此标头必须至少附加到发送数据的第一个chunck(chunck=header+data)。请注意,音频只能播放,直到客户端达到您必须在标题中指定的下载文件大小。因此,解决方法是在标题中设置一些大文件大小,例如2GB。


2
投票

而不是头部函数中的datasize = len(samples) * channels * bitsPerSampledatasize = 2000*10**6

def gen_audio():

    CHUNK = 512
    sampleRate = 44100
    bitsPerSample = 16
    channels = 2
    wav_header = genHeader(sampleRate, bitsPerSample, channels)

    audio = AudioRead()
    data = audio.get_audio_chunck()
    chunck = wav_header + data
    while True:
        yield (chunck)
        data = audio.get_audio_chunck()
        chunck = data

1
投票

试试这对我有用。 shell cmd“cat”工作正常使用FLASK查看代码iam

import subprocess
import os
import inspect
from flask import Flask
from flask import Response

@app.route('/playaudio')
    def playaudio():
        sendFileName=""
        def generate():

            #  get_list_all_files_name this function gives all internal files inside the folder

   filesAudios=get_list_all_files_name(currentDir+"/streamingAudios/1")

            # audioPath is audio file path in system 
            for audioPath in filesAudios:
                data=subprocess.check_output(['cat',audioPath])
                yield data
        return Response(generate(), mimetype='audio/mp3')

0
投票

经过大量的研究和修补,我终于找到了解决方案。

基本上,它使用Flask的SocketIO实现通过WebSockets提供pyaudio.paFloat32音频数据,并使用HTML5的AudioContext在JavaScript中接收/播放数据。

由于这需要相当多的代码,我认为在这里发布它不是一个好主意。相反,请随时查看我正在使用的项目:simpleCam

相关代码位于: - noise_detector.py(录制) - server.py(WebSocket传输) - static / js / player.js(接收/播放)

谢谢大家的支持!

© www.soinside.com 2019 - 2024. All rights reserved.