如何在现场使用python将wav转为mp3?

问题描述 投票:11回答:3

我有像下面所示的代码,从麦克风获得音频。

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秒的音频数据.这只是6kb的数据,当我保存10帧(1秒的音频)到光盘,并将其转换为MP3使用pdub模块。在通过socket发送之前,我如何将每个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
python windows python-2.7 pyaudio
3个回答
1
投票

试试 python-audiotools. 我想它会帮助你流转你想要的音频文件。


0
投票

从阅读pydub的代码来看,似乎一个AudioSegment只允许在使用 出_f 变量。所以,你可以读取WAV文件,并将每个分块编码到一个文件中,然后读取文件并发送出去,在另一端进行解码。但是,这样的效率并不高。我建议实际扩展pydub来处理流,并为项目做出贡献。导出代码非常直接,我敢说做起来不会太难。笔者可能会感激不尽。

AudioSegment的代码在这里。https:/github.comjiaaropydubblobmasterpydubaudio_segment.py。


0
投票

我能够找出一个工作方法,使用 flaskffmpeg...

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中。

这个解决方案也适用于这个类似的问题。如何在Python中给定一个NumPy数组来流式传输MP3块?

© www.soinside.com 2019 - 2024. All rights reserved.