Jak mogę wyodrębnić audio z wideo za pomocą ffmpeg?

227

Próbowałem następujące polecenie, aby wyodrębnić audio z wideo:

ffmpeg -i Sample.avi -vn -ar 44100 -ac 2 -ab 192k -f mp3 Sample.mp3

ale otrzymuję następujące dane wyjściowe

libavutil     50.15. 1 / 50.15. 1
libavcodec    52.72. 2 / 52.72. 2
libavformat   52.64. 2 / 52.64. 2
libavdevice   52. 2. 0 / 52. 2. 0
libavfilter    1.19. 0 /  1.19. 0
libswscale     0.11. 0 /  0.11. 0
libpostproc   51. 2. 0 / 51. 2. 0
SamplE.avi: Invalid data found when processing input

Czy ktoś może pomóc?

użytkownik1269669
źródło

Odpowiedzi:

406

Aby wyodrębnić strumień audio bez ponownego kodowania:

ffmpeg -i input-video.avi -vn -acodec copy output-audio.aac
  • -vn nie ma wideo.
  • -acodec copy mówi, użyj tego samego strumienia audio, który już tam jest.

Przeczytaj wynik, aby zobaczyć, jaki to kodek, i ustaw właściwe rozszerzenie nazwy pliku.

Paul Irish
źródło
54
i zamiast po raz pierwszy uruchomić ffmpeg, aby sprawdzić, który to strumień audio, użyj ffprobe input-video.avi
FlorianB
15
Jeśli wyodrębnisz tylko dźwięk ze strumienia wideo, jego długość może być mniejsza niż długość wideo. Aby upewnić się, że tak się nie stanie, wypakuj zarówno dźwięk ORAZ wideo z tym samym wywołaniem do ffmpeg, np. „Ffmpeg -i vid.avi -map 0: a audio.wav -map 0: v onlyvideo.avi
BlenderBender
2
Byłoby wspaniale rozwinąć tę odpowiedź za pomocą polecenia, które również obudowuje surowy AAC w kontenerze M4A.
Gras Double
8
W tym konkretnym przypadku po prostu zamień „.aac” na „.m4a” w ścieżce docelowej. ffmpeg jest wystarczająco inteligentny, aby odgadnąć twoje zamiary, i umieszcza wynik w pojemniku M4A :)
Gras Double
1
FWIW, stworzyłem skrypt PHP, więc po prostu określam wejściowy plik wideo, a on automatycznie określa rozszerzenie wyjściowego pliku audio: superuser.com/questions/1301901/...
Gras Double
117

Aby zakodować wysokiej jakości plik MP3 z AVI najlepiej użyć -q: a dla zmiennej szybkości transmisji:

ffmpeg -i sample.avi -q:a 0 -map a sample.mp3

Jeśli chcesz wyodrębnić część dźwięku z wideo, użyj opcji -ss , aby określić początkowy znacznik czasu, a opcji -t , aby określić czas kodowania, np. Od 3 minut i 5 sekund przez 45 sekund:

ffmpeg -i sample.avi -ss 00:03:05 -t 00:00:45.0 -q:a 0 -map a sample.mp3
  • Znaczniki czasu muszą być w formacie GG: MM: SS.xxx lub w sekundach.

  • Jeśli nie określisz opcji -t , przejdzie ona do końca.

Przykład roboczy:

  1. Pobieranie ffmpeg
  2. Otwórz wiersz polecenia (Start> Uruchom> CMD) lub w systemie Linux / Mac otwórz terminal
  3. cd do katalogu z plikiem ffmeg.exe
  4. Wydaj polecenie i poczekaj na plik wyjściowy (lub rozwiąż ewentualne błędy)

wprowadź opis zdjęcia tutaj

Jeremy Thompson
źródło
3
Oto przewodnik po -q:awartościach: trac.ffmpeg.org/wiki/Encode/MP3 Zero to ustawienie VBR najwyższej jakości, które zwykle skutkuje średnimi przepływnościami w górnej części rozsądnego zakresu CBR (gdzie 320 kbit / s to maksimum, prawdopodobnie nieco powyżej punktu, w którym kompresja bezstratna staje się bardziej odpowiednia).
Evgeni Sergeev
3
I co -map azrobić?
Iulian Onofrei
Zastrzeżenie: jest to ponowne kodowanie dźwięku ze stratną kompresją, która nieznacznie obniży jakość. Jeśli oryginał jest już skompresowany, jakość dwukrotnie się pogorszy, co może, ale nie musi być zauważalne.
Davidmh,
To polecenie działa dla mnie, gdy powyższe -vnnie działa.
Mmm
12

Wiersz poleceń jest poprawny i działa na poprawnym pliku wideo. Upewnij się, że zainstalowałeś poprawną bibliotekę do pracy z mp3, zainstaluj lame o probe z innym kodekiem audio.

Zazwyczaj

ffmpeg -formats

lub

ffmpeg -codecs

dałby wystarczające informacje, abyś wiedział więcej.

Álvaro
źródło
11

ffmpeg -i sample.avipoda informacje o formacie audio / wideo dla pliku. Upewnij się, że masz skonfigurowane odpowiednie biblioteki do analizowania strumieni wejściowych. Upewnij się również, że plik nie jest uszkodzony.

smp
źródło
teraz mam poprawny wynik, kiedy próbowałem tego samego komentarza z .mkv vedio. dlaczego to nie działa dla .avi, czy jest jakieś polecenie ffmpeg do konwersji .avi
1269669
1
AVI lub MKV odnosi się do formatu kontenera, który może pomieścić wiele różnych formatów audio / wideo. Nie chcesz konwertować audio AVI, chcesz przekonwertować ścieżkę audio w pliku AVI, którego jeszcze nie określiłeś. Użyj polecenia wymienionego powyżej, aby zobaczyć, jaki rodzaj ścieżki audio znajduje się w pliku AVI. Jeśli jest to MP3, musisz skompilować FFMPEG z biblioteką MP3 taką jak LAME lame.sourceforge.net
smp
6

Aby zakodować mp3 audio ffmpeg.org pokazuje następujący przykład:

ffmpeg -i input.wav -codec:a libmp3lame -qscale:a 2 output.mp3

Wyodrębniłem dźwięk z wideo, zastępując input.wavgo nazwą pliku wideo. 2Środki 190 kb / s. Pozostałe poziomy jakości można zobaczyć pod moim linkiem powyżej.

Suragch
źródło
Ten przykład dotyczy konwersji pliku audio do innego formatu, a nie wyodrębnienia go z wideo.
Iulian Onofrei
@IulianOnofrei, jak opisałem w mojej odpowiedzi, możesz zastąpić plik audio plikiem wideo. To zadziałało dla mnie.
Suragch
6

Oto, czego właśnie użyłem:

ffmpeg -i my.mkv -map 0:3 -vn -b:a 320k my.mp3

Objaśnienie opcji:

  • my.mkv to źródłowy plik wideo, możesz także używać innych formatów
  • -map 0:3oznacza, że ​​chcę trzeciego strumienia z pliku wideo. Umieść swoje N tam - pliki wideo często zawierają wiele strumieni audio; możesz go pominąć lub użyć -map 0:adomyślnego strumienia audio. Biegaćffprobe my.mkv aby zobaczyć, jakie strumienie ma plik wideo.
  • my.mp3 to docelowa nazwa pliku audio, a ffmpeg stwierdza, że ​​chcę MP3 z jego rozszerzenia. W moim przypadku źródłowy strumień audio to ac3 DTS i po prostu kopiowanie nie było tym, czego chciałem
  • 320k jest pożądaną docelową przepływnością
  • -vn oznacza, że ​​nie chcę wideo w pliku docelowym
Artem Wasiliew
źródło
2

Tylko zgadnij:

-ab 192

Powinien być

-ab 192k

Wygląda na to, że może to stanowić problem, ale może ffmpeg jest wystarczająco inteligentny, aby to naprawić.

Chaotyczny
źródło
2
Ważny komentarz, a ja zredagowałem pytanie OP, aby je zmienić, ale to niczego nie zmienia (co najwyżej daje ostrzeżenie).
Jean-Philippe Pellet
2

Jeśli dźwięk zawinięty w avi nie jest na początku w formacie mp3, może być konieczne podanie go -acodec mp3jako dodatkowego parametru. Lub czymkolwiek jest twój kodek mp3 (w systemach Linux to prawdopodobnie -acodec libmp3lame). Możesz również uzyskać ten sam efekt, -f mp3niezależny od platformy, zamiast tego określając „wymuszenie” formatu na mp3, chociaż nie wszystkie wersje ffmpeg nadal obsługują ten przełącznik. Twój przebieg może się różnić.

Xheralt
źródło
2

Aby wyodrębnić bez konwersji, używam pozycji menu kontekstowego - jako akcji niestandardowej menedżera plików w systemie Linux - do uruchomienia następujących czynności (po sprawdzeniu, jaki typ audio zawiera wideo; przykład dla wideo zawierającego oggaudio):

bash -c 'ffmpeg -i "$0" -map 0:a -c:a copy "${0%%.*}".ogg' %f 

który jest oparty na poleceniu ffmpeg ffmpeg -i INPUT -map 0:a -c:a copy OUTPUT.

Użyłem tego -map 0:1bez problemów, ale, jak powiedział w komentarzu @LordNeckbeard, Nie gwarantuje się , że strumień 0:1zawsze będzie audio. Używanie -map 0:azamiast -map 0:1pozwoli uniknąć dwuznaczności”.


źródło
1
Strumień 0:1nie gwarantuje, że zawsze będzie audio. Używanie -map 0:azamiast -map 0:1pozwoli uniknąć dwuznaczności.
llogan
@ LordNeckbeard ~ Uwzględnię to, dzięki.
Kiedyś mediainfoustalałem ścieżkę audio i wybrałem ją w następujący sposób: -map 0:a:1gdzie a: 1 to indeks drugiej ścieżki dźwiękowej, dzięki! -c:a copyznacznie szybciej!
Wodnik Moc
1

Dla osób szukających prostszego sposobu na wydobycie dźwięku z pliku wideo przy zachowaniu parametrów oryginalnego pliku wideo, możesz użyć:

ffmpeg -i <video_file_name.extension> <audio_file_name.extension>

Na przykład uruchamianie:

ffmpeg -i screencap.mov screencap.mp3

wyodrębnia mp3plik audio z movpliku wideo.

Iulian Onofrei
źródło
Prosty i działa. Dlaczego wszystkie inne rozwiązania są tak skomplikowane? +1
Scott Biggs
1
Pytanie brzmi: dlaczego to ma głos usuwania ?!
Iulian Onofrei
-1

Użyj -b:azamiast -abjako-ab jest już nieaktualne, upewnij się również, że ścieżka do pliku wejściowego jest poprawna.

Aby wyodrębnić audio z wideo użyłem poniżej polecenia i działa dobrze.

String[] complexCommand = {"-y", "-i", inputFileAbsolutePath, "-vn", "-ar", "44100", "-ac", "2", "-b:a", "256k", "-f", "mp3", outputFileAbsolutePath};

Tutaj,

  • -y - Zastąp pliki wyjściowe bez pytania.
  • -i - FFmpeg odczytuje z dowolnej liczby „plików” wejściowych określonych przez -i opcję
  • -vn - Wyłącz nagrywanie wideo
  • -ar - ustawia częstotliwość próbkowania dla strumieni audio, jeśli są zakodowane
  • -ac - Ustaw liczbę kanałów audio.
  • -b:a - Ustaw bitrate audio
  • -f - format

Sprawdź to dla mojego kompletnego przykładowego projektu Android FFmpeg na GitHub.

Programista Androida
źródło