我想通过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中),我得到了一个流,但所有这些都来自扬声器是一个“点击” - 噪音。
我愿意接受任何建议。如何将我的麦克风实时流式传输(无预录制!)输入到网络浏览器?
谢谢!
很久以前就问过这个问题,但由于我花了一整天的时间来弄清楚如何实现这个问题,我想给出答案。也许对某人有帮助。
“[Errno 32] Broken pipe”错误来自客户端无法播放音频并关闭此流的事实。由于数据流中没有标题,因此无法播放音频。您可以使用代码genHeader(sampleRate, bitsPerSample, channels, samples)
中的here函数轻松创建标题。此标头必须至少附加到发送数据的第一个chunck(chunck=header+data
)。请注意,音频只能播放,直到客户端达到您必须在标题中指定的下载文件大小。因此,解决方法是在标题中设置一些大文件大小,例如2GB。
而不是头部函数中的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
试试这对我有用。 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')
经过大量的研究和修补,我终于找到了解决方案。
基本上,它使用Flask的SocketIO实现通过WebSockets提供pyaudio.paFloat32音频数据,并使用HTML5的AudioContext在JavaScript中接收/播放数据。
由于这需要相当多的代码,我认为在这里发布它不是一个好主意。相反,请随时查看我正在使用的项目:simpleCam
相关代码位于: - noise_detector.py(录制) - server.py(WebSocket传输) - static / js / player.js(接收/播放)
谢谢大家的支持!