-pattern_type glob
Ta świetna opcja w wielu przypadkach ułatwia wybieranie obrazów.
Pokaz slajdów wideo z jednym obrazem na sekundę
ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
-c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
Dodaj do tego trochę muzyki, odetnij, gdy przypuszczalnie dłuższy dźwięk, gdy kończą się obrazy:
ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
-c:a copy -shortest -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
Oto dwie wersje demonstracyjne w YouTube:
Bądź hipisem i używaj nieobciążonego patentem formatu wideo Theora :
ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
-c:a copy -shortest -c:v libtheora -r 30 -pix_fmt yuv420p out.ogg
Twoje obrazy powinny być oczywiście posortowane alfabetycznie, zazwyczaj jako:
0001-first-thing.jpg
0002-second-thing.jpg
0003-and-third.jpg
i tak dalej.
Chciałbym również najpierw upewnić się, że wszystkie używane obrazy mają ten sam współczynnik proporcji, być może wcześniej przycinając je za pomocą imagemagick
lub nomacs , aby ffmpeg nie musiał podejmować trudnych decyzji. W szczególności szerokość musi być podzielna przez 2, w przeciwnym razie konwersja nie powiedzie się z: „szerokość niepodzielna przez 2”.
Wideo z normalną prędkością z jednym obrazem na klatkę przy 30 FPS
ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
-c:v libx264 -pix_fmt yuv420p out.mp4
Oto jak to wygląda:
GIF wygenerowany za pomocą: /ubuntu/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574
Dodaj do niego trochę dźwięku:
ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
-i audio.ogg -c:a copy -shortest -c:v libx264 -pix_fmt yuv420p out.mp4
Wynik: https://www.youtube.com/watch?v=HG7c7lldhM4
Oto media testowe, których użyłem: a
wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg
Obrazy generowane za pomocą: Jak używać GLUT / OpenGL do renderowania do pliku?
Fajnie jest obserwować, jak bardzo wideo kompresuje sekwencję obrazów znacznie lepiej niż ZIP, ponieważ jest w stanie kompresować między klatkami za pomocą wyspecjalizowanych algorytmów:
opengl-rotating-triangle.mp4
: 340 tys
opengl-rotating-triangle.zip
: 7,3 mln
Konwertuj jeden plik muzyczny na wideo ze stałym obrazem do przesłania do YouTube
Odpowiedział na: /superuser/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572
Pełna realistyczna konfiguracja studium przypadku pokazu slajdów krok po kroku
Tworzenie pokazów slajdów to trochę więcej niż uruchamianie pojedynczego polecenia ffmpeg, więc oto bardziej interesujący, szczegółowy przykład inspirowany tą osią czasu .
Pobierz nośnik wejściowy:
mkdir -p orig
cd orig
wget -O 1.png https://upload.wikimedia.org/wikipedia/commons/2/22/Australopithecus_afarensis.png
wget -O 2.jpg https://upload.wikimedia.org/wikipedia/commons/6/61/Homo_habilis-2.JPG
wget -O 3.jpg https://upload.wikimedia.org/wikipedia/commons/c/cb/Homo_erectus_new.JPG
wget -O 4.png https://upload.wikimedia.org/wikipedia/commons/1/1f/Homo_heidelbergensis_-_forensic_facial_reconstruction-crop.png
wget -O 5.jpg https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Sabaa_Nissan_Militiaman.jpg/450px-Sabaa_Nissan_Militiaman.jpg
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg
cd ..
# Convert all to PNG for consistency.
# /unix/29869/converting-multiple-image-files-from-jpeg-to-pdf-format
# Hardlink the ones that are already PNG.
mkdir -p png
mogrify -format png -path png orig/*.jpg
ln -P orig/*.png png
Teraz przyjrzymy się wszystkim rozmiarom obrazu, aby zdecydować o ostatecznym współczynniku proporcji:
identify png/*
które wyjścia:
png/1.png PNG 557x495 557x495+0+0 8-bit sRGB 653KB 0.000u 0:00.000
png/2.png PNG 664x800 664x800+0+0 8-bit sRGB 853KB 0.000u 0:00.000
png/3.png PNG 544x680 544x680+0+0 8-bit sRGB 442KB 0.000u 0:00.000
png/4.png PNG 207x238 207x238+0+0 8-bit sRGB 76.8KB 0.000u 0:00.000
png/5.png PNG 450x600 450x600+0+0 8-bit sRGB 627KB 0.000u 0:00.000
więc klasyczny współczynnik proporcji 480p (640x480 == 4/3) wydaje się odpowiedni.
Wykonaj jedną konwersję z minimalną zmianą rozmiaru, aby uzyskać równe szerokości (TODO automatyzuje dowolną szerokość, tutaj po prostu ręcznie spojrzałem na identify
wynik i zmniejszono szerokość i wysokość o jeden):
mkdir -p raw
convert png/1.png -resize 556x494 raw/1.png
ln -P png/2.png png/3.png png/4.png png/5.png raw
ffmpeg -framerate 1 -pattern_type glob -i 'raw/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p raw.mp4
Daje to okropną wydajność, ponieważ jak widać z:
ffprobe raw.mp4
ffmpeg po prostu przyjmuje rozmiar pierwszego obrazu, 556x494, a następnie konwertuje wszystkie pozostałe do tego dokładnego rozmiaru, łamiąc ich proporcje.
Teraz automatycznie przekonwertujmy obrazy na docelowy współczynnik proporcji 480p, przycinając zgodnie z ImageMagick: jak minimalnie przyciąć obraz do określonego współczynnika proporcji?
mkdir -p auto
mogrify -path auto -geometry 640x480^ -gravity center -crop 640x480+0+0 png/*.png
ffmpeg -framerate 1 -pattern_type glob -i 'auto/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p auto.mp4
Więc teraz współczynnik proporcji jest dobry, ale nieuchronnie trzeba było wykonać pewne kadrowanie, które wycina interesujące części obrazów.
Inną opcją jest wypełnienie czarnym tłem, aby uzyskać ten sam współczynnik proporcji, jak pokazano na: Zmień rozmiar, aby zmieścić się w ramce i ustawić tło na czarne w „pustej” części
mkdir -p black
ffmpeg -framerate 1 -pattern_type glob -i 'black/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p black.mp4
Ogólnie rzecz biorąc, najlepiej byłoby wybrać obrazy o takich samych lub podobnych proporcjach, aby uniknąć tych problemów w pierwszej kolejności.
Informacje o opcjach CLI
Zauważ jednak, że pomimo nazwy, -glob
nie jest to tak ogólne, jak wzorce powłoki Glob, np: -i '*'
nie powiodło się: https://trac.ffmpeg.org/ticket/3620 (najwyraźniej dlatego, że typ pliku jest wywnioskowany z rozszerzenia).
-r 30
sprawia, że -framerate 1
wideo ma 30 klatek na sekundę, aby przezwyciężyć błędy w odtwarzaczach, takich jak VLC, przy niskiej liczbie klatek na sekundę: VLC zawiesza się przy niskim 1 kl./s wideo utworzonym z obrazów za pomocą ffmpeg Dlatego powtarza każdą klatkę 30 razy, aby zachować pożądany efekt 1 obrazu na sekundę.
Następne kroki
Będziesz także chciał:
DO ZROBIENIA: naucz się wycinać i łączyć wiele plików audio w wideo bez plików pośrednich, jestem prawie pewien, że jest to możliwe:
Testowany
ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.
Bibliografia