2011-05-24 26 views
8

Necesito convertir archivos de audio mp3 a 64 kbps en el lado del servidor.¿Cuál es el equivalente Python de Lame MP3 Converter?

En este momento, estoy usando subprocess para llamar al lame, pero me pregunto si hay alguna buena alternativa?

+0

En serio, ¿has probado Google? Cuando googleo 'Python mp3' el primer hit es [PyMedia] (http://pymedia.org/), que parece hacer exactamente lo que quiere. –

+3

Se dice que PyMedia solo funciona para Python <2.4 – satoru

+2

PyMedia sí que murió en Python 2.4. Por cierto, cuando google 'use lame mp3 python', esta pregunta aparece irónicamente. –

Respuesta

2

Parece que hay un hilo un poco pasada sobre este tema aquí: http://www.dreamincode.net/forums/topic/72083-lame-mp3-encoder-for-python/

La conclusión final era crear una unión medida para lame_enc.dll a través de enlaces de Python-> C.

El motivo de esta conclusión fue que las bibliotecas de enlace existentes (pymedia/py-lame) no se han mantenido.

Desafortunadamente el tipo no conseguir que funcione :)

tal vez debería seguir utilizando subprocess. Puede aprovechar esa opción, abstraer su codificación a un nivel ligeramente superior y reutilizar el código/estrategia para ejecutar opcionalmente otras herramientas de codificación de línea de comandos (como las herramientas ogg o shn).

He visto varias herramientas de copiado de audio adoptar esa estrategia.

0

Si desea utilizar LAME para codificar sus MP3 (y no PyMedia), siempre puede usar ctypes para envolver la DLL del codificador cojo (o .so si usted está en Linux). El código de envoltura exacto que usará estará vinculado a la versión LAME DLL (y hay muchos de estos volando por ahí, desafortunadamente), así que realmente no puedo darle ningún ejemplo, pero los documentos de los tipos deben ser lo suficientemente claros. acerca de envolver archivos DLL.

0

Advertencia: programador relativamente nuevo aquí y no he tenido la necesidad de convertir archivos de audio antes.

Sin embargo, si entiendo correctamente lo que quiere decir del lado del servidor, es posible que esté buscando un buen enfoque para administrar las conversiones masivas, y su interés en una solución de python podría ser en parte para poder administrar mejor uso de recursos o integrar en su cadena de procesamiento. Tuve un problema/objetivo similar, que resolví usando una combinación de la recomendación de Merlyn y Apio. No uso django-apio, pero si esto es para un proyecto basado en django, eso también podría atraerlo. Puede encontrar más información sobre el apio aquí:

Dependiendo de lo que ha configurado ya, puede haber un poco de tiempo por adelantado necesaria para obtener una configuración. Para aprovechar todo, necesitarás tener instalado rabbitmq/erlang, pero si sigues la guía en los sitios anteriores, ahora es bastante rápido.

Aquí hay un ejemplo de cómo uso el apio con subproceso para solucionar un problema similar. De forma similar a la sugerencia del póster anterior, utilizo un subproceso para llamar a ffmpeg, que es tan bueno como para las herramientas de video, y probablemente también sea tan bueno como para las herramientas de audio. Incluyo un poco más de lo necesario aquí para darte una idea de cómo puedes configurar un poco tuyo.

#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) 

Avísame si te fue útil. Soy relativamente nuevo en responder preguntas aquí y no estoy seguro si mis intentos son útiles o no. ¡Buena suerte!

1

He estado trabajando con Python Audio Tools, que es capaz de realizar conversiones entre diferentes formatos de audio.

Ya lo he usado para convertir archivos .wav en mp3, .flac y .m4a.

+0

Parece que no puedo encontrar ningún ejemplo de código fuente, todo parece ser herramientas de línea de comandos. – Mark

+0

Agregué un pequeño ejemplo de código a mi cuenta/blog github. http://jackboot7.posterous.com/python-audio-tools –

+1

'herramientas de audio de python' es impresionante, pero no es lo que estás buscando, utiliza' lame' para hacer la codificación de mp3. – intuited

0

Bueno, Gstreamer tiene el "plugin feo" lamemp3enc y hay python bindings para Gstreamer (gst-python 1.2, compatible con python 3.3). No he intentado hacer esta ruta yo mismo, así que no estoy realmente en posición de recomendar nada ... Francamente, una solución de subproceso parece mucho más simple, si no "limpia", para mí.

Cuestiones relacionadas