我正在将我的服务器麦克风的音频发送到浏览器中(与this帖子类似,但进行了一些修改)。
一切都很顺利,直到您转到移动设备或Safari,完全不起作用。我已尝试使用类似howler的东西来处理前端,但没有成功(仍然可以在Chrome上和计算机上工作,但无法在手机上的Safari / Chrome等上运行)。<audio> ... </audio>
在Chrome上很好,但只能在计算机上使用。
function play_audio() {
var sound = new Howl({
src: ['audio_feed'],
format: ['wav'],
html5: true,
autoplay: true
});
sound.play();
}
如何发送一个实时的wav生成的音频流,使其在任何浏览器中都能正常工作?
编辑230203:
我已经将错误缩小到了头部(至少我认为是导致错误的原因)。
应该使用哪些头部来使所有浏览器都可以使用声音?
以这个简单的app.py
为例:
from flask import Flask, Response, render_template
import pyaudio
import time
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html', headers={'Content-Type': 'text/html'})
def generate_wav_header(sampleRate, bitsPerSample, channels):
datasize = 2000*10**6
o = bytes("RIFF",'ascii')
o += (datasize + 36).to_bytes(4,'little')
o += bytes("WAVE",'ascii')
o += bytes("fmt ",'ascii')
o += (16).to_bytes(4,'little')
o += (1).to_bytes(2,'little')
o += (channels).to_bytes(2,'little')
o += (sampleRate).to_bytes(4,'little')
o += (sampleRate * channels * bitsPerSample // 8).to_bytes(4,'little')
o += (channels * bitsPerSample // 8).to_bytes(2,'little')
o += (bitsPerSample).to_bytes(2,'little')
o += bytes("data",'ascii')
o += (datasize).to_bytes(4,'little')
return o
def get_sound(InputAudio):
FORMAT = pyaudio.paInt16
CHANNELS = 2
CHUNK = 1024
SAMPLE_RATE = 44100
BITS_PER_SAMPLE = 16
wav_header = generate_wav_header(SAMPLE_RATE, BITS_PER_SAMPLE, CHANNELS)
stream = InputAudio.open(
format=FORMAT,
channels=CHANNELS,
rate=SAMPLE_RATE,
input=True,
input_device_index=1,
frames_per_buffer=CHUNK
)
first_run = True
while True:
if first_run:
data = wav_header + stream.read(CHUNK)
first_run = False
else:
data = stream.read(CHUNK)
yield(data)
@app.route('/audio_feed')
def audio_feed():
return Response(
get_sound(pyaudio.PyAudio()),
content_type = 'audio/wav',
)
if __name__ == '__main__':
app.run(debug=True)
有一个长这样的 index.html 文件:
<html>
<head>
<title>Test audio</title>
</head>
<body>
<button onclick="play_audio()">
Play audio
</button>
<div id="audio-feed"></div>
</body>
<script></script>
</html>
启动Flask开发服务器
python app.py
并使用Chrome进行测试,如果您有麦克风,您将听到输入声音(最好使用耳机,否则您会得到一个声音循环)。 Firefox也可以正常工作。但是,如果您尝试在iPhone上的任何浏览器中使用相同的应用程序,则不会收到声音,并且在MacOS上使用safari也是如此。
没有任何错误,您可以在safari中看到音频的字节流被下载,但仍然没有声音。
是什么导致这种情况?我认为我应该在audio_feed响应中使用某些头文件,但是经过数小时的调试,我似乎找不到与此相关的任何内容。
编辑230309:
@Markus指出应遵循
RFC7233 HTTP范围请求
。那可能就是了。虽然firefox、chrome和可能更多桌面浏览器发送byte=0-
作为头请求,但在iOS上使用的safari和浏览器发送byte=0-1
作为头请求。
iOS
标签。 - etuardu