如何使用python实时将wav转换为mp3?

Posted

技术标签:

【中文标题】如何使用python实时将wav转换为mp3?【英文标题】:how to convert wav to mp3 in live using python? 【发布时间】:2014-10-17 14:45:29 【问题描述】:

我有如下所示的代码来从麦克风获取音频:

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

此代码运行良好。然而,每个 data 帧的大小为 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

【问题讨论】:

我只需在 Google 上搜索 mp3 encoder python 即可发现此链接:pymedia.org/tut/recode_audio.html 看来这正是您想要的。 @selbie ...您为什么不将其转换为答案并收集赏金? @jimm101 - 我所做的只是谷歌寻找答案。当我回答这个问题的时间不超过 10 秒,没有增加任何洞察力,也没有展示除了我的 133 吨互联网搜索技能之外​​的任何相关经验/知识时,期望得分是很蹩脚的。 :) 如果我经常用 Python 编码并实现了音频代码,那可能是另一回事了。但是对于这个问题,我所做的只是谷歌的答案...... @jimm101 你能举个例子吗,我试过 pydub,pyffmpg,pyaudio。没有选项可以即时编码。每个库都可以选择写入文件 为什么不使用 zlib 来压缩数据。我知道首选的选项是编码为 mp3,从而更有效地压缩音频,但如果您正在寻找一个可以作为流工作的快速答案,我会使用 zlib。 【参考方案1】:

试试python-audiotools。我认为它将帮助您流式传输所需的音频文件。

【讨论】:

Python API 文档(相对于命令行)位于audiotools.sourceforge.net/programming/index.html【参考方案2】:

我能够找到使用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 中受支持。

这个解决方案也适用于这个类似的问题:How to stream MP3 chunks given a NumPy array in Python?

【讨论】:

以上是关于如何使用python实时将wav转换为mp3?的主要内容,如果未能解决你的问题,请参考以下文章

Python 将 wav 转换为 mp3

如何使用 Java 将 .wav 转换为 .mp3? [关闭]

如何使用 sox 将 wav 文件转换为 mp3 格式? [关闭]

使用 NAudio/Lame 将 .wav 转换为 mp3 时如何设置通道和采样率?

如何将任何 mp3 文件转换为 .wav 16khz mono 16bit

如何在不实际转换的情况下确定转换后音频文件的理论文件大小(即 mp3 到 wav)