【发布时间】:2020-03-22 17:39:44
【问题描述】:
作为概念验证,我需要创建一个 HTTP 服务器,它在 GET 请求时应该启动非编码/非压缩音频数据的连续流 - WAV、PCM16。假设音频数据是 4096 个随机生成的单声道音频样本,采样率为 44.1kHz。
为了让另一端的浏览器在其 UI 中启动播放器让用户实时收听,我应该在 HTTP 响应标头中添加什么?
我正在阅读有关“Transfer-Encoding: chunked”、“multipart”、mimetype="audio/xwav" 的信息,但仍然不知道使用什么以及如何使用...
如果有人能给我一个关于 Python/Flask 的确切示例,那就太好了,因为我对 Web 开发不是很有信心。
PS1:将 HTTP 服务器替换为硬件功率有限的嵌入式设备将是 PoC 之后的下一个阶段。
PS2:这是实际工作并将 WAV 块作为单个 HTTP 响应发送的代码:
from flask import Flask, Response,render_template
import pyaudio
import audio_processing as audioRec
app = Flask(__name__)
def genHeader(sampleRate, bitsPerSample, channels, samples):
datasize = samples * channels * bitsPerSample // 8
o = bytes("RIFF",'ascii') # (4byte) Marks file as RIFF
o += (datasize + 36).to_bytes(4,'little') # (4byte) File size in bytes excluding this and RIFF marker
o += bytes("WAVE",'ascii') # (4byte) File type
o += bytes("fmt ",'ascii') # (4byte) Format Chunk Marker
o += (16).to_bytes(4,'little') # (4byte) Length of above format data
o += (1).to_bytes(2,'little') # (2byte) Format type (1 - PCM)
o += (channels).to_bytes(2,'little') # (2byte)
o += (sampleRate).to_bytes(4,'little') # (4byte)
o += (sampleRate * channels * bitsPerSample // 8).to_bytes(4,'little') # (4byte)
o += (channels * bitsPerSample // 8).to_bytes(2,'little') # (2byte)
o += (bitsPerSample).to_bytes(2,'little') # (2byte)
o += bytes("data",'ascii') # (4byte) Data Chunk Marker
o += (datasize).to_bytes(4,'little') # (4byte) Data size in bytes
return o
FORMAT = pyaudio.paInt16
CHUNK = 102400 #1024
RATE = 44100
bitsPerSample = 16 #16
CHANNELS = 1
wav_header = genHeader(RATE, bitsPerSample, CHANNELS, CHUNK)
audio = pyaudio.PyAudio()
# start Recording
stream = audio.open(format=FORMAT, channels=CHANNELS,
rate=RATE, input=True, input_device_index=10,
frames_per_buffer=CHUNK)
# print "recording..."
@app.route('/')
def index():
"""Video streaming home page."""
return render_template('index2.html')
@app.route('/audio_unlim')
def audio_unlim():
# start Recording
def sound():
#while True:
# data = wav_header + stream.read(CHUNK)
# yield(data)
data = wav_header + stream.read(CHUNK)
yield(data)
return Response(sound(),
mimetype="audio/x-wav")
if __name__ == "__main__":
app.run(host='0.0.0.0', debug=True, threaded=True,port=5000)
和 index2.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<audio controls>
<source src="{{ url_for('audio_unlim') }}" type="audio/x-wav;codec=pcm">
Your browser does not support the audio element.
</audio
</body>
</html>
为了实现块的连续流需要改变什么?
【问题讨论】:
-
这能回答你的问题吗? Audio Livestreaming with Python & Flask
-
@noslenkwah,不,这不能解决我的问题。您所指的链接是关于如何使用单个 HTTP 响应一次性发送一大块数据。我想通过使用“Transfer-Encoding:chunked”或“Content-Transfer-Encoding:multipart”来获得连续的音频数据流。仍然不确定 HTTP 序列图如何执行此操作以及在 HTTP 标头和 MIME 中键入什么以通知浏览器启动相应的播放器以正确解释 WAV 标头中的 RIFF 数据...
标签: python http flask audio-streaming http-live-streaming