我有类似下面显示的代码来从麦克风获取音频:
import pyaudio
p = pyaudio.PyAudio()
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 1024*10
RECORD_SECONDS = 10
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
send_via_socket(data) # function to send each frame to remote system
此代码工作正常。但是,每个数据框架的大小为4kb。这意味着需要40kb的互联网数据才能发送1秒的音频数据。 当我将10帧(1秒音频)保存到光盘并使用pdub模块将其转换为mp3时,它只有6kb的数据。 如何在通过套接字发送之前将每个wav帧转换为mp3? (我只需要减小帧的大小以节省网络使用量)。 例如:
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK) # data =4kb
mp3_frame = wav_to_mp3(data) # mp3_frame should be 1kb or less
send_via_socket(mp3_frame) # function to send each frame to remote system
答案 0 :(得分:1)
尝试python-audiotools。我认为它可以帮助您流式传输您想要的音频文件。
答案 1 :(得分:0)
通过阅读pydub的代码,似乎AudioSegment只允许使用 out_f 变量输出到文件。因此,您可以读取WAV文件并将每个块编码为文件,然后读取文件并将其发送出去,在另一端解码。但是,这不是很有效。我建议实际扩展pydub以处理流并为项目做出贡献。导出代码非常简单,我敢打赌它不会太难。作者可能会感激不尽。
AudioSegment的代码在这里: https://github.com/jiaaro/pydub/blob/master/pydub/audio_segment.py
答案 2 :(得分:0)
我能够使用flask
和ffmpeg
...找到一种可行的方法...
import select
import subprocess
import numpy
from flask import Flask
from flask import Response
app = Flask(__name__)
def get_microphone_audio(num_samples):
# TODO: Add the above microphone code.
audio = numpy.random.rand(num_samples).astype(numpy.float32) * 2 - 1
assert audio.max() <= 1.0
assert audio.min() >= -1.0
assert audio.dtype == numpy.float32
return audio
def response():
pipe = subprocess.Popen(
'ffmpeg -f f32le -acodec pcm_f32le -ar 24000 -ac 1 -i pipe: -f mp3 pipe:'
.split(),
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
poll = select.poll()
poll.register(pipe.stdout, select.POLLIN)
while True:
pipe.stdin.write(get_synthetic_audio(24000).tobytes())
while poll.poll(0):
yield pipe.stdout.readline()
@app.route('/stream.mp3', methods=['GET'])
def stream():
return Response(
response(),
headers={
# NOTE: Ensure stream is not cached.
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Pragma': 'no-cache',
'Expires': '0',
},
mimetype='audio/mpeg')
if __name__ == "__main__":
app.run(host='0.0.0.0', port=8000, debug=True)
此解决方案支持实时流式传输,并且在Chrome,Firefox和Safari中受支持。
此解决方案也适用于以下类似问题:How to stream MP3 chunks given a NumPy array in Python?