Połącz jeden obraz + jeden plik audio, aby utworzyć jeden film za pomocą FFmpeg

To powinno być dość trywialne, ale nie mogę znaleźć sposobu, aby to zadziałało.

Chcę, aby FFmpeg wziął jeden obraz JPEG i plik audio jako wejście i wygenerował plik wideo o tym samym czasie trwania co plik audio(rozciągając nieruchomy obraz na cały czas trwania).

Nie obchodzi mnie, jaki kodek wideo jest używany do wyjścia, ale ważne jest, abym mógł użyć "copy" jako kodeka audio (tzn. skopiować strumień audio bez transkodowania go).

Co czy właściwy wiersz poleceń by to zrobił?

Próbowałem:

ffmpeg -i image8.jpg -i sound11.amr -acodec copy test.avi

I próbowałem wielu kombinacji z I BEZ -s 640x360, -loop_input, -shortest, -t xxx, -r 0.1 (sztucznie niska liczba klatek na sekundę w nadziei, że film będzie dłuższy) i -f image2

Albo dostaję błędy, albo dostaję plik wideo o czasie trwania jednej klatki.

Poszperałem w googlach i znalazłem kilkanaście proponowanych rozwiązań (podobno na to samo pytanie), z których żadne nie działa.

Czy ktoś może zasugerować Komenda robocza i Wyjaśnienie jej uzasadnienia?
Author: Peter Mortensen, 2011-05-04

13 answers

Kolejność opcji w wierszu poleceń ma znaczenie. Następujące prace dla mojego przypadku:

ffmpeg -loop 1 -y -i image8.jpg -i sound11.amr -shortest -acodec copy -vcodec mjpeg result.avi

W bardziej ogólnym przypadku, gdzie image.jpg i audio.wav są Twoimi danymi wejściowymi, możesz użyć następującego polecenia, zaadaptowanego z FFmpeg wiki :

ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest out.mp4

To wykorzysta koder libx264 i zapewni lepszą kompresję niż kodek MJPEG użyty powyżej. Dźwięk jest AAC, z wbudowanym koderem ffmpeg AAC.

 187
Author: matteo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-01 08:40:30

Jeszcze łatwiej:

ffmpeg -i ep1.png -i ep1.wav ep1.flv

FFmpeg spróbuje wybrać najlepszy kodek automatycznie, w zależności od rozszerzenia pliku wyjściowego.

Update: zauważyłem, że YouTube ma trudności z przetwarzaniem wideo (utknie na 95%) myślę, że ponieważ jest tylko jedna klatka. Rozwiązanie, które znalazłem, aby uszczęśliwić YouTube: dodaj więcej ramek. Dodałem również -acodec copy, Aby zachować jakość dźwięku. Potrzebujesz -shortest albo zapętli się na zawsze. (Zatrzymuje się na końcu najkrótszego strumienia, jakim jest dźwięk, ponieważ pętla obrazu jest nieskończona.) Kolejność opcji jest bardzo ważna dla szybkości, ponieważ filtry (i takie) są przetwarzane w określonej kolejności. jeśli zmienisz kolejność tych parametrów, wyniki będą diametralnie różne.

ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:720 ep1.flv

Zauważ również, że ustawiłem dwukrotnie częstotliwość klatek, to nie przypadek-pierwsza częstotliwość klatek jest dla wejścia, druga dla wyjścia. Jeśli zrobisz to poprawnie, powinno być tylko jedna klatka na Sekundę wideo, które czyli koduje relatywnie szybko. Również ustawiłem tutaj rozdzielczość na 720p, co oznacza, że powinieneś uzyskać dźwięk HD na YouTube: -)

 46
Author: PJ Brunet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-26 02:09:30

Sprawiasz, że jest ciężej niż musi być. FFmpeg jest o wiele mądrzejszy niż ci się wydaje-wie, że chcesz, aby film był tej samej długości, co ścieżka audio.

ffmpeg -i still.png -i narrate.wav -acodec libvo_aacenc -vcodec libx264 final.flv

pause

Jedyne atrybuty, które masz do określenia to input filenames, na output codecs, oraz output filename (które eo ipso zawiera output container, ).

Oczywiście, ma sens zacząć od still jeśli używasz dedykowanego edytora obrazów, zamiast określać wymiary wyjściowe dla FFmpeg, musisz upewnić się, że wymiary wejściowe to liczby parzyste .

Rozmiar wyjściowy jest jednym z najczęstszych zawieszeń w FFmpeg; niektóre kodeki są bardziej ograniczone w wymiarach wyjściowych niż inne, ale żadne wyjście nie może mieć nieparzystych atrybutów wysokości lub szerokości.

The pause polecenie na końcu pliku wsadowego utrzymuje CLI otwarte-- najlepszym sposobem debugowania linii poleceń jest odczytanie komunikatów o błędach , które generuje. Są one bardzo specyficzne--i najlepsza dokumentacja FFmpeg ma--ale ciężka praca deweloperów jest marnowana, jeśli pozwolisz, aby okno się zamknęło, zanim będziesz mógł je przeczytać.

Powłoka komend posiada przełącznik cmd /k to utrzymuje otwarte okno, w którym można uruchomić te same instrukcje z partii skrypt w wierszu polecenia.

FFmpeg i avconv sprawią, że -c:a na -acodec oraz -c:v na -vcodec W końcu, ale stare instrukcje działają dobrze w kompilacjach, których używam.

Nota Bene: każdy commit ma idiosynkracje. Jeśli linia poleceń nie działa bez wyraźnego powodu, często pomocne jest wypróbowanie innej kompilacji--lub podążanie za rozwidleniem do libav, gdzie Najbardziej aktywnymi programistami FFmpeg są od kilku lat. Ich narzędzie do transkodowania zostało przemianowane na avconv, ale twoje pliki wsadowe powinny działać z jednym z nich.

 44
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-16 14:21:53

Wersja, która mi się sprawdziła:

 ffmpeg -loop 1 -y -i pic.jpg -i sound.amr -shortest video.mp4

Checkout opcja -shortest musi być przed plikiem wyjściowym, jeśli nie, dostaję poniższy błąd:

opcja Najkrótsza (Zakończ kodowanie w najkrótszym wejściu) nie może być zastosowana do pliku wejściowego pic.jpg - próbujesz zastosować opcję wprowadzania do pliku wyjściowego lub odwrotnie. Przenieś tę opcję przed plik, do którego należy. Błąd parsowania opcji pliku wejściowego pic..jpg

 19
Author: fguillen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-28 20:16:15

Ze strony Man ffmpeg:

ffmpeg [[infile options][-i infile]]... {[outfile options] outfile}...

Jak odkryłeś, opcje infile muszą być przed infile, do którego mają zastosowanie.

Nie jest to jednak błąd, tylko mechanizm, za pomocą którego można określić, które argumenty infile mają zastosowanie.

 8
Author: ComputerDruid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-22 00:40:56

To zadziałało dla mnie

FFmpeg-loop 1-shortest-y-i image.jpg-i audio. mp3-acodec copy-vcodec libx264 video.avi

Znalazłem vcodec libx264 stworzył znacznie mniejsze pliki niż mpjeg (10 MB zamiast 100 MB).

 5
Author: Colonel Panic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-15 22:15:45

Oto pełne wyjaśnienie:

ffmpeg -i image.jpg -i audio.mp3 -c:v libx264 -tune stillimage -c:a copy out.mp4

Nie używałem -loop 1 ani -shortest. -loop 1 drastycznie spowalnia kodowanie i tworzy większy plik. {[6] } nie powinien być używany bez -loop 1 ponieważ wtedy wideo będzie miało jedną klatkę. Jednak YouTube nie lubi filmów z jedną klatką (patrz odpowiedź PJ bruneta), więc należy użyć obu opcji.

 5
Author: qwr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-06 20:54:45

Próbowałem zrobić jak @matteo , ale bez dźwięku, a @Colonel Panic rozwiązanie działało najlepiej :

ffmpeg -loop 1 -shortest -y -i still.png -vcodec libx264 -t 10 video.avi

Musiałem tylko dodać argument duration w sekundach (-t 10).

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-18 11:44:09

Jeśli ktoś chce je konwertować, spróbuj tego.

Możesz ustawić Folder wejściowy i wyjściowy, a także format, w którym chcesz, aby film był. W tym przypadku ustawiłem go na AVI.

Ta ODPOWIEDŹPołącz jeden obraz + jeden plik audio, aby stworzyć jeden film za pomocą FFmpeg Bardzo mi pomogła.

 @echo off
 set "sourcedir=C:\Users\CodeHard\Desktop\BOX\Newfolder"  
 set "outputdir=C:\Users\CodeHard\Desktop\BOX\Converted" 

 PUSHD "%sourcedir%"

 for %%F in (*.mp3) DO ffmpeg -r 1 -loop 1 -i abc.jpeg -i "%%F" -acodec copy -r 1 -shortest -vf scale=1280:720 "%outputdir%\%%F.avi"  

 POPD
 1
Author: Suraj Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-12 18:19:47

Sklonowany z PJ Brunet's odpowiedź:

ffmpeg -r 1 -loop 1 -y -i 1.jpg -i 1.m4a -c:a copy -r 1 -vcodec libx264 -shortest 1.avi

W rezultacie uzyskano najmniejszy rozmiar (18MB) i najszybszy czas kodowania (tylko 2 sekundy dla 17MB pliku m4a)

 1
Author: Kokizzu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-08 05:02:29

ffmpeg -loop 1 -i img.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest out.mp4

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-22 12:15:39

Użyłem kombinacji kilku poleceń wymienionych w tym poście, w tym -pix_fmt yuv420p aby upewnić się, że działa na Quicktime (Mac).

ffmpeg -loop 1 -y -i image.jpg -i music.mp3 -shortest -pix_fmt yuv420p output.mp4
Dla mnie to działało idealnie na macOS.
 0
Author: Hay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-03 22:18:31

Spróbuj tego polecenia. Dla mnie to działa.

-y -i /storage/emulated/0/images.jpg -i /storage/emulated/0/audio.wav -acodec aac -vcodec mpeg4 -s 480*320 -f mp4 -r 2 /storage/emulated/0/output.mp4"
 -1
Author: Phani varma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-24 08:13:12