我想通过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]断管”
当用open(“tmp.wav”)取消注释时 - part(self.save()可选地获取所有先前的帧并将它们保存在tmp.wav中),我得到一个流,但所有出来的扬声器是一个“点击” - 噪音。
我愿意接受任何建议。如何将我的麦克风实时流式传输(无预录制!)输入到网络浏览器?
谢谢!
答案 0 :(得分:2)
很久以前就问过这个问题,但是由于我花了一整天的时间弄清楚如何实现相同的问题,所以我想给出答案。也许对某人会有帮助。
“ [Errno 32]管道损坏” 错误是由于客户端无法播放音频并关闭此流而导致的。
由于数据流中没有标题,因此无法播放音频。您可以使用here代码中的genHeader(sampleRate, bitsPerSample, channels, samples)
函数轻松创建标头。此标头必须至少附加到已发送数据的第一块(chunck=header+data
)。请注意,音频只能只能播放,直到客户端达到您必须在标题中指定的下载文件大小为止。因此,解决方法是在标头中设置一些大文件大小,例如2Gb。
答案 1 :(得分:2)
在标头函数中写datasize = len(samples) * channels * bitsPerSample
而不是datasize = 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
答案 2 :(得分: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')
答案 3 :(得分:0)
经过大量研究和修补,我终于找到了解决方案。
基本上,归结为使用Flask的SocketIO实现通过WebSockets提供pyaudio.paFloat32音频数据,以及使用HTML5的AudioContext在JavaScript中接收/播放数据。
因为这需要一些代码,所以我认为将其全部张贴在这里并不是一个好主意。相反,请随时在simpleCam
中检出我正在使用的项目相关代码在: -noise_detector.py(录制) -server.py(WebSocket传输) -static / js / player.js(接收/播放)
感谢大家的支持!