Что такое Python-эквивалент Lame MP3 Converter? - PullRequest
8 голосов
/ 24 мая 2011

Мне нужно преобразовать аудиофайлы mp3 в 64 кбит / с на стороне сервера.

Сейчас я использую subprocess для вызова lame, но мне интересно, есть ли хорошие альтернативы?

Ответы [ 5 ]

2 голосов
/ 24 мая 2011

Здесь, кажется, есть немного старая тема на эту тему: http://www.dreamincode.net/forums/topic/72083-lame-mp3-encoder-for-python/

Окончательный вывод заключался в создании настраиваемой привязки к lame_enc.dll через привязки Python-> C.

Причиной такого вывода было то, что существующие библиотеки привязки (pymedia / py-lame) не были сохранены.

К сожалению, парень не получил его на работу:)

Может быть, вы должны продолжать использовать subprocess. Вы можете воспользоваться этим выбором, абстрагировать кодировку на несколько более высоком уровне и повторно использовать код / ​​стратегию для необязательного выполнения других инструментов кодирования командной строки (таких как ogg или shn).

Я видел, как несколько инструментов копирования аудио применяли эту стратегию.

1 голос
/ 16 февраля 2012

Я работал с Python Audio Tools , который способен выполнять преобразования между различными аудиоформатами.

Я уже использовал его для преобразования файлов .wav в mp3, .flac и .m4a.

0 голосов
/ 28 марта 2014

Ну, Gstreamer имеет "уродливый плагин" lamemp3enc и есть привязок python для Gstreamer (gst-python 1.2, поддерживает python 3.3).Я сам не пробовал идти по этому пути, поэтому не могу ничего рекомендовать ... Честно говоря, решение для подпроцесса кажется мне намного проще, если не "чище".

0 голосов
/ 24 мая 2011

Предостережение: здесь относительно новый программист, и у меня не было необходимости конвертировать аудио файлы раньше.

Однако, если я правильно понимаю, что вы подразумеваете под серверной стороной, возможно, вы ищете хороший подход к управлению массовыми конверсиями, и ваш интерес к решению на python может быть частично для того, чтобы иметь возможность лучше управлять ресурсом использовать или интегрировать в вашу цепочку обработки. У меня была похожая проблема / цель, которую я решил, используя сочетание рекомендаций Merlyn и Celery . Я не использую django-celery, но если это для проекта, основанного на django, это может вас заинтересовать. Вы можете узнать больше о сельдерее здесь:

В зависимости от того, что вы уже настроили, может потребоваться немного времени для установки. Чтобы воспользоваться всеми преимуществами, вам нужно установить rabbitmq / erlang, но если вы будете следовать руководству на сайтах, приведенных выше, это довольно быстро.

Вот пример того, как я использую сельдерей с подпроцессом для решения аналогичной проблемы. Подобно предложению автора, приведенному выше, я использую подпроцесс для вызова 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)

Дайте мне знать, было ли это полезно для вас. Я относительно новичок в ответах на вопросы здесь и не уверен, полезны ли мои попытки или нет. Удачи!

0 голосов
/ 24 мая 2011

Если вы хотите использовать LAME для кодирования ваших MP3 (а не PyMedia), вы всегда можете использовать ctypes , чтобы обернуть DLL кодера хромого кодера (или .so, если вы используете Linux).Точный код обертки, который вы будете использовать, будет привязан к версии LAME DLL (а их, к сожалению, много), поэтому я не могу дать вам никакого примера, но документы ctypes должны быть достаточно яснымиоб упаковке DLL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...