在Python中简单转码mp3为ogg(实时)的方法?

8 投票
1 回答
3940 浏览
提问于 2025-04-16 14:36

我在找一个库或者模块,可以实时把MP3(其他格式也可以)转换成OGG。

我需要这个的原因是:我正在写一个相对简单的网页应用,主要是为了自己用,让人们可以通过浏览器听音乐。为了播放音乐,我打算使用新的强大标签<audio>。不过,很多浏览器对MP3的支持并不好。实时转换听起来是最好的选择,因为这样不会浪费硬盘空间(如果我把整个音乐库都转换的话),而且因为最多也就2-3个人同时听,所以性能问题也不大。

简单来说,我需要输入一个MP3(或者其他格式),然后得到一个像文件一样的对象,这样我就可以把它传回我的框架(顺便说一下,我用的是flask)给客户端使用。

我查过的一些东西:

  • gstreamer -- 看起来功能太强大了,虽然支持很多格式,但文档实在太差了
  • timeside -- 看起来简单易用,但里面有很多我不需要的东西(图表、分析、用户界面...)
  • PyMedia -- 最后更新是在2006年2月1日...

有什么建议吗?

1 个回答

7

你知道,使用 subprocess 来调用外部工具并没有什么不好。例如,你可以像这样构建管道:

#!/usr/bin/env python
import subprocess
frommp3 = subprocess.Popen(['mpg123', '-w', '-', '/tmp/test.mp3'], stdout=subprocess.PIPE)
toogg = subprocess.Popen(['oggenc', '-'], stdin=frommp3.stdout, stdout=subprocess.PIPE)
with open('/tmp/test.ogg', 'wb') as outfile:
    while True:
        data = toogg.stdout.read(1024 * 100)
        if not data:
            break
        outfile.write(data)

实际上,这可能是你最好的方法。想想看,在一个多CPU的系统上,MP3解码器和OGG编码器会在不同的进程中运行,并且可能会被安排在不同的核心上。如果你尝试用一个单线程的库来做同样的事情,你的转码速度就只能跟一个核心的处理能力一样快。

撰写回答