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?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.
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: -)
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.
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
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.
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).
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
-
-i image.jpg -i audio.mp3
: wejścia obrazu i dźwięku -c:v libx264
: Użyj x264 do kodowania wideo.-tune stillimage
: x264 ustawienie optymalizacji wideo dla kodowania nieruchomego obrazu-c:a copy
: kopiuje kodek używany do wejścia audio. Możesz to zmienić, jeśli chcesz mieć inny kodek audio.
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.
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
).
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
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)
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
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.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"
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