2012-05-01 12 views
6

Estoy tratando de usar ffmpeg con el módulo de subproceso de Python para convertir algunos archivos de audio. Agarro los archivos de audio de una URL y me gustaría poder pasar los objetos de archivo de Python a ffmpeg, en lugar de guardarlos en el disco. También sería muy bueno si pudiera recuperar una secuencia de archivos en lugar de tener ffmpeg guardar el resultado en un archivo.Cómo uso ffmpeg con Python pasando objetos de archivo (en lugar de ubicaciones a archivos en el disco)

Como referencia, esto es lo que estoy haciendo ahora:

tmp = "/dev/shm" 
audio_wav_file = requests.get(audio_url) 
##    ##       ## 
## This is what I don't want to have to do ## 
wavfile = open(tmp+filename, 'wrb') 
wavfile.write(audio_wav_file.content) 
wavfile.close() 
##    ##       ## 
conversion = subprocess.Popen('ffmpeg -i "'+tmp+filename+'" -y "'+tmp+filename_noext+'.flac" 2>&1', shell = True, stdout = subprocess.PIPE).stdout.read() 

¿Alguien sabe cómo hacer esto?

Gracias!

Respuesta

7

con ffmpeg puede usar - como nombre de archivo de entrada/salida para indicar que debe leer los datos de stdin/write a stdout.

Luego puede usar los argumentos stdin/stdout de Popen para leer/escribir sus datos.

un ejemplo:

from subprocess import Popen, PIPE 

with open("test.avi", "rb") as infile: 
    p=Popen(["ffmpeg", "-i", "-", "-f", "matroska", "-vcodec", "mpeg4", 
     "-acodec", "aac", "-strict", "experimental", "-"], 
      stdin=infile, stdout=PIPE) 
    while True: 
     data = p.stdout.read(1024) 
     if len(data) == 0: 
      break 
     # do something with data... 
     print(data) 
    print p.wait() # should have finisted anyway 

vez que el suministro de un archivo para stdin también se podría utilizar un PIPE y escribir directamente a la corriente de entrada de procesos (p.stdin). o en su caso, simplemente usaría el archivo wav ...

tenga en cuenta que debe especificar el formato de salida y los códecs explícitamente, ya que ffmpeg no puede adivinarlos desde la extensión del archivo como suele hacerlo.
y solo funcionará para muxers que no necesiten flujos de salida buscables, pero flac debería funcionar ...

0

ya que parece que está en Unix (sin .exe en el extremo de 'ffmpeg'), yo recomendaría el uso de una tubería con nombre, también conocido como FIFO:

mkfifo multimedia-pipe 

que el script de Python escribir el datos de audio en 'archivo multimedia' y pida a FFmpeg que lea desde el mismo archivo. He utilizado este patrón para decodificar archivos multimedia en sus enormes representaciones crudas para la validación sin tener que ocupar espacio en el disco.

Alternativamente, intente pasar la URL 'http: // ...' directamente a la opción de entrada de FFmpeg.

Cuestiones relacionadas