什么是相当于Lame MP3 Converter的Python?

时间:2011-05-24 08:32:41

标签: python audio

我需要在服务器端将mp3音频文件转换为64kbps。

现在,我正在使用subprocess来致电lame,但我想知道是否有其他不错的选择?

5 个答案:

答案 0 :(得分:2)

这个主题似乎有一个稍微陈旧的主题:http://www.dreamincode.net/forums/topic/72083-lame-mp3-encoder-for-python/

最后的结论是通过Python-> C绑定创建对lame_enc.dll的自定义绑定。

结论的原因是现有的绑定库(pymedia / py-lame)尚未维护。

不幸的是,这家伙没有让它上班:)

也许你应该继续使用subprocess。您可以利用该选择,在稍高的级别抽象编码,并重用代码/策略以选择性地执行其他命令行编码工具(例如ogg或shn工具)。

我见过几种音频翻录工具采用这种策略。

答案 1 :(得分:1)

我一直在使用Python Audio Tools,它能够在不同的音频格式之间进行转换。

我已经用它将.wav文件转换为mp3,.flac和.m4a。

答案 2 :(得分:0)

如果您想使用LAME对MP3(而不是PyMedia)进行编码,您可以始终使用ctypes来包装跛脚编码器DLL(如果您使用的是Linux,则使用.so)。您将使用的确切包装代码将绑定到LAME DLL版本(不幸的是,其中有许多飞来飞去),所以我真的不能给你任何例子,但ctypes文档应该足够清楚关于包装DLL。

答案 3 :(得分:0)

警告:这里相对较新的程序员,我之前不需要转换音频文件。

但是,如果我理解服务器端的意思,那么您可能正在寻找一种管理批量转换的好方法,而您对python解决方案的兴趣可能部分是为了能够更好地管理资源使用或集成到您的处理链中。我有一个类似的问题/目标,我使用Merlyn的推荐和 Celery 混合解决。我不使用django-celery,但如果这是基于django的项目,那也可能对你有吸引力。你可以在这里找到更多关于芹菜的信息:

根据您已经设置的内容,进行设置可能需要一些前期时间。要利用你需要安装rabbitmq / erlang的所有东西,但是如果你按照上面网站上的指南进行操作,那么它现在很快。

以下是我如何使用芹菜与子进程解决类似问题的示例。类似于上面提到的海报的建议,我使用subprocess来调用ffmpeg,这对于视频工具来说就像它一样好,并且实际上可能与音频工具一样好。我在这里包含了一些不必要的东西,让你感觉如何配置自己的一点。

    #example of configuring an option, here I'm selecting how much I want to adjust bitrate
    #based on my input's format
    def generate_command_line_method(self):
        if self.bitrate:
            compression_dict =  {'.mp4':1.5, '.rm':1.5, '.avi': 1.2, 
                                '.mkv': 1.2, '.mpg': 1, '.mpeg':1}
            if self.ext.lower() in compression_dict.keys():
                compression_factor = compression_dict[self.ext.lower()]

        #Making a list to send to the command line through subprocess
        ffscript = ['ffmpeg',
                   '-i', self.fullpath,
                   '-b', str(self.bitrate * compression_factor),
                   '-qscale', '3', #quality factor, based on trial and error
                   '-g', '90', #iframe roughly per 3 seconds
                   '-intra',
                    outpath
                   ]
        return ffscript

        #The celery side of things, I'd have a celeryconfig.py file in the 
        #same directory as the script that points to the following function, so my task 
        #queue would know the specifics of the function I'll call through it.  You can
        #see example configs on the sites above, but it's basically just going to be
        #a tuple that says, here are the modules I want you to look in, celery, e.g.
        #CELERY_MODULES = ("exciting_asynchronous_module.py",).  This file then contains, 


        from celery.decorators import task
        from mymodule import myobject
        from subprocess import Popen

        @task(time_limit=600) #say, for example, 10 mins
        def run_ffscript(ffscript):
            some_result = Popen(ffscript).wait() 

            #Note: we'll wait because we don't want to compound
            #the asynchronous aspect (we don't want celery to launch the subprocess and think
            #it has finished.

        #Then I start up celery/rabbitmq, and got into my interactive shell (ipython shown):
        #I'll have some generator feeding these ffscripts command lines, then process them 
        #with something like:

        In[1]: for generated_ffscript in generator:
                  run_ffscript.delay(generated_ffscript)

如果这对您有用,请告诉我。我在这里回答问题比较新,不确定我的尝试是否有用。祝好运!

答案 4 :(得分:0)

好吧,Gstreamer有“丑陋的插件”lamemp3enc,Gstreamer有python bindings(gst-python 1.2,支持python 3.3)。我自己没有尝试过这条路线所以我真的不能推荐任何东西......坦率地说,对我来说,子流程解决方案似乎更简单,如果不是“更清洁”的话。