在python(live)中将mp3转码为ogg的简单方法?

时间:2011-03-28 20:51:29

标签: python audio transcoding

我正在寻找一个可以动态地将MP3(其他格式是加号)转码为OGG的库/模块。

我需要这个:我正在编写一个相对较小的网络应用程序,供个人使用,这将允许人们通过浏览器收听他们的音乐。对于聆听部分,我打算使用新的强大的<audio>标签。但是,很少有浏览器支持MP3。实时转码似乎是最好的选择,因为它不会浪费磁盘空间(就像我要转换整个音乐库一样)而且我不会遇到性能问题,因为最多只能有2-3个听众。< / p>

基本上,我需要提供一个MP3(或其他任何东西),然后得到一个类似文件的对象,我可以传回我的框架(顺便说一下flask)来提供给客户端

我看过的东西:

  • gstreamer - 虽然对很多格式有很好的支持,但似乎有点过分了;文件缺乏可怕的
  • timeside - 看起来很好用且很简单,但它又有很多我不需要的东西(图形,分析,UI ......)
  • PyMedia - 最后更新时间:2006年2月1日......

建议?

1 个答案:

答案 0 :(得分: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编码器将在不同的进程中运行,并且可能会在不同的内核上进行调度。如果您尝试对单线程库执行相同操作,则只能以单核处理它的速度进行转码。