2012-05-01 7 views
6

Próbuję użyć ffmpeg z modułem podprocesu Pythona do konwersji niektórych plików audio. Pobieram pliki audio z adresu URL i chcę po prostu móc przekazywać obiekty plików Pythona do ffmpeg, zamiast najpierw zapisywać je na dysku. Byłoby również bardzo miłe, gdybym mógł po prostu odzyskać strumień plików, zamiast mieć ffmpeg zapisywać dane wyjściowe do pliku.Jak korzystać z ffmpeg z Pythonem, przekazując Obiekty plików (zamiast lokalizacji do plików na dysku)

Dla porównania, jest to, co robię teraz:

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

Czy ktoś wie jak to zrobić?

Dzięki!

Odpowiedz

7

z ffmpeg można użyć - jako nazwy pliku wejściowego/wyjściowego, aby wskazać, że powinien odczytać dane z stdin/write na standardowe wyjście.

Następnie można użyć argumentów /stdout dla Popen do odczytu/zapisu danych.

przykład:

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 

zamiast tego dostarczania pliku dla stdin można również użyć PIPE i pisać bezpośrednio do strumienia wejściowego procesy (p.stdin). lub w twoim przypadku po prostu użyjesz wavfile ...

Pamiętaj, że musisz wyraźnie określić format wyjściowy i kodeki, ponieważ ffmpeg nie może odgadnąć ich z rozszerzenia pliku, tak jak zwykle.
i będzie działać tylko dla muxerów, które nie potrzebują dostępnych strumieni wyjściowych, ale flac powinien działać ...

0

Ponieważ wygląda na to, że jesteś na systemie Unix (bez .exe na końcu „ffmpeg”), polecam użyciu nazwanego potoku, aka FIFO:

mkfifo multimedia-pipe 

Czy skrypt Pythona napisać danych audio do "pliku multimedialnego" i poproś FFmpeg, aby odczytał z tego samego pliku. Użyłem tego wzorca do dekodowania plików multimedialnych w ich ogromnych, nieprzetworzonych reprezentacjach do sprawdzania poprawności bez zajmowania miejsca na dysku.

Alternatywnie spróbuj podać URL "http: // ..." bezpośrednio do opcji wprowadzania FFmpeg.