gpt4 book ai didi

python - HTTP实时音频流服务器

转载 作者:太空宇宙 更新时间:2023-11-03 20:04:13 26 4
gpt4 key购买 nike

作为概念验证,我需要创建一个 HTTP 服务器,该服务器在 GET 请求时应启动连续的非编码/非压缩音频数据流 - WAV、PCM16。我们假设音频数据是 4096 个随机生成的单声道音频样本 block ,采样率为 44.1kHz。

我应该在 HTTP 响应 header 中添加什么内容,以便另一端的浏览器在其 UI 中启动播放器供用户实时收听?

我正在阅读有关“Transfer-Encoding: chunked”、“multipart”、mimetype="audio/xwav"的内容,但仍然不知道使用什么以及如何使用...

如果有人能给我一个有关 Python/Flask 的确切示例,那就太好了,因为我对 Web 开发不太有信心。

PS1:PoC 之后的下一阶段将是用硬件能力有限的嵌入式设备取代 HTTP 服务器。

PS2:这是实际工作的代码,并将 WAV block 作为单个 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>

要改变什么才能实现连续的 block 流?

最佳答案

建议采用分块传输编码,因为资源的长度不定。如果没有它,您将需要指定 Content-Length header 。较旧的客户端过去无法很好地处理分块传输编码,因此旧的黑客要么忽略 Content-Length完全 header (HTTP/1.0 行为),或指定非常大(实际上无限)的长度。

至于Content-Type ,您可以使用audio/vnd.wav;codec=1对于常规 PCM。

请务必设置preload="none"在您的<audio>上元素,以便浏览器不会尝试提前缓冲内容。

关于python - HTTP实时音频流服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59065564/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com