2014-11-04 11 views
12

Powiązane:Python ekstrakt wav z pliku wideo

How to extract audio from a video file using python?

Extract audio from video as wav

How to rip the audio from a video?

Moje pytanie brzmi: w jaki sposób mogę wyodrębnić wav ścieżki dźwiękowej z plików wideo, powiedzmy video.avi? Czytam wiele artykułów i wszędzie ludzie sugerują używać (z Python) ffmpeg jako podprocesu (ponieważ nie ma żadnych niezawodnych powiązań Pythona z ffmpeg - jedyną nadzieją było PyFFmpeg, ale znalazłem, że jest teraz niemobilny). Nie wiem, czy to właściwe rozwiązanie i szukam dobrego.
Spojrzałem na GStreamer i okazało się, że ładne, ale niezdolny do zaspokojenia moich potrzeb - jedyny sposób znalazłem do osiągnięcia tego z wiersza poleceń wygląda

gst-launch-0.10 playbin2 uri=file://`pwd`/ex.mp4 audio-sink='identity single-segment=true ! audioconvert ! audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)16000, channels=(int)1 ! wavenc ! filesink location=foo.wav’ 

Ale to nie jest skuteczny, bo trzeba czekać wieki, podczas gdy odtwarzanie wideo i jednoczesne zapisywanie do pliku wav.

ffmpeg jest znacznie lepiej:

avconv -i foo.mp4 -ab 160k -ac 1 -ar 16000 -vn ffaudio.wav 

ale jestem w stanie uruchomić go od python (nie jako podproces linii poleceń). Czy możesz wskazać mi plusy i minusy uruchamiania ffmpeg z Pythona jako narzędzia wiersza poleceń? (Mam na myśli użycie modułu python multiprocessing lub czegoś podobnego).

Drugie pytanie.

Co to jest prosty sposób cięcia długiego pliku WAV na kawałki, aby nie łamać żadnych słów? mam na myśli kawałki o długości 10-20 sekund z początkiem i końcem podczas przerwy w zdaniach/słowach?

wiem jak złamać je na dowolnych elementów:

import wave 


win= wave.open('ffaudio.wav', 'rb') 
wout= wave.open('ffsegment.wav', 'wb') 

t0, t1= 2418, 2421 # cut audio between 2413, 2422 seconds 
s0, s1= int(t0*win.getframerate()), int(t1*win.getframerate()) 
win.readframes(s0) # discard 
frames= win.readframes(s1-s0) 

wout.setparams(win.getparams()) 
wout.writeframes(frames) 

win.close() 
wout.close() 
+0

Wspominasz 'ffmpeg', ale używasz' avconv'. – LordNeckbeard

+0

Zobacz http://stackoverflow.com/questions/9477115/who-can-tell-me-the-difference-andrelation-between-ffmpeg-libav-and-avconv. Są to różne projekty i zastępowanie się nawzajem. 'avconv', jeśli rozwidlenie' ffmpeg', które zostało zrobione, aby zdystansować się od 'projektu FFmpeg'. – xolodec

+0

Jeśli uruchomisz program ffmeg w Ubuntu, zobaczysz następujący komunikat: 'Program ffmpeg zapewnia tylko zgodność ze skryptami i zostanie usunięty w przyszłej wersji. Został przestarzały w projekcie Libav, aby umożliwić niekompatybilne ulepszenia składni wiersza poleceń w jego zastępstwie o nazwie avconv. Proszę użyć avconv zamiast. " – xolodec

Odpowiedz

18

Jest to bardzo łatwe zadanie używając ffmpeg z pytona subprocess i nie ma powodu, dlaczego ludzie są skierowane do tego roztworu jako dobre rozwiązanie.

Jest to podstawowa komenda wydobywania dźwięku z danego pliku wideo:

ffmpeg -i test.mp4 -ab 160k -ac 2 -ar 44100 -vn audio.wav

Kod Python jest po prostu owijania polecenie:

import subprocess 

command = "ffmpeg -i C:/test.mp4 -ab 160k -ac 2 -ar 44100 -vn audio.wav" 

subprocess.call(command, shell=True) 

musisz się upewnić, że ffmpeg jest znanym zadanie, więc w zmiennych środowiskowych systemu, w ramach ścieżki, ścieżka do ffmpeg.exe powinien być na liście, lub możesz po prostu użyć pełnej ścieżki do exe w swoim kodzie Pythona.

+0

Dziękuję bardzo mach. Ale nie jestem nowy w Pythonie i wiem, jak to osiągnąć dzięki modułowi 'subprocess' lub' multiprocessing'. Pytałem o możliwe wady tego podejścia. Z wyjątkiem nieznanej ścieżki do 'ffmpeg' /' aconv' w systemie (który mogłem łatwo znaleźć sam) nic o nich nie wiem. Zadałem to pytanie w nadziei, że ktoś wskaże mi inne wady tego podejścia. – xolodec

+0

Szczerze mówiąc, jeśli próbujesz użyć darmowych dostępnych bibliotek, nie sądzę, że znajdziesz coś lepszego i łatwiejszego w użyciu niż ffmpeg. – user1767754

+0

Czy musimy podać absolutną ścieżkę do 'videofile' i' audiofile' w tym kodzie, jeśli nasz plik '.py' znajduje się w innym miejscu? – abhi1610

3

to mogłoby być lepsze i łatwiejsze w użyciu niż ffmpeg, nazywa konwerter python-wideo, i mogą być używane, aby wyodrębnić audio z video, https://github.com/senko/python-video-converter, może być stosowany w połączeniu z mpg123, co następuje

from converter import Converter 
    import os 
    c = Converter() 
    clip = 'clip.avi' 
    conv = c.convert(clip, 'audio.mp3', {'format':'mp3','audio':{'codec': 'mp3','bitrate':'22050','channels':1}}) 
    for timecode in conv: 
     pass  
    os.system("mpg123 -w audio.wav audio.mp3") 

moduł konwertera wydobywa dźwięk z filmu i zapisuje go jako plik mp3, podczas gdy mpg123 konwertuje plik mP3, MP4,

inne rozwiązanie jest w następujący sposób: użyciu modułu moviepy w Pythonie https://github.com/Zulko/moviepy

import moviepy.editor as mp 
    clip = mp.VideoFileClip("video.avi").subclip(0,20) 
    clip.audio.write_audiofile("theaudio.mp3") 

liczby w ramach funkcji subclip określają początek i koniec dźwięku w sekundach. można użyć mpg123 zmienić audio do jakiegokolwiek innego formatu