Powiedzmy, że mam plik mp3 o długości 1 minuty. I mam 20 zdjęć PNG. Chcę połączyć te obrazy i dźwięk w plik wideo, ale nie chcę, aby każdy obraz trwał 3 sekundy na ekranie, chcę, aby niektóre obrazy trwały 5 sekund, inne 1 sekundę itp.
Jedyny sposób, jaki mogę wymyślić, to po prostu skopiować obrazy, które powinny trwać dłużej, np. Aby obraz1, obraz2, obraz3 były dokładnie takie same, daje mi to 3 razy więcej czasu na wideo.
Jest to jednak bardzo czasochłonne i zajmuje dużo miejsca. Czy jest jakiś przełącznik / parametr w ffmpeg, który pozwala mi to zrobić?
Odpowiedzi:
Za pomocą ffmpeg 2.0 można to zrobić na kilka sposobów:
Jedną z metod jest użycie czasów modyfikacji plików. Najpierw ustaw czas modyfikacji plików obrazów, aby każdy plik obrazu miał czas modyfikacji dłuższy niż przed nim; różnica czasu to czas trwania poprzedniego obrazu (z rozdzielczością 1 sekundy). Następnie użyj opcji demuxera image2
-ts_from_file 1
. Na przykład:Inną metodą jest użycie
concat
demuxera , który pobiera listę plików do konkatenacji, z opcjonalnym czasem trwania. Najpierw utwórz plik z obrazami i czasem trwania, który wygląda następująco:Następnie podaj ten plik jako dane wejściowe do ffmpeg. Na przykład:
Może być konieczne zduplikowanie ostatniego pliku po końcowym czasie trwania.
-c:a copy
kopiuje niezmienione audio MP3; jeśli chcesz przekonwertować go na inny kodek audio, możesz to określić zamiastcopy
. Możesz także określić inny kodek wideo za pomocą-c:v
lub inny format pikseli-pix_fmt
, na przykład-c:v libx264 -pix_fmt yuv420p
.-vf fps=25
spowoduje, że wyjściowa liczba klatek na sekundę będzie wynosić 25 fps. Jeśli dźwięk jest dłuższy i chcesz go odciąć po obrazach, użyj tej-shortest
opcji.źródło
-c:v libx264 -profile:v baseline -pix_fmt yuv420p out.mp4
zamiast out.avi lub wypróbuj innego odtwarzacza, takiego jak mpv lub ffplay. Upewnij się także, że używasz bieżącej wersji FFmpeg, i powiel ostatnią nazwę pliku obrazu po końcowym czasie trwania.Zarozumiały
ffmpeg -i in.ffconcat -vf fps=25 out.avi
(2018: zawartość pliku in.ffconcat) - to działa:
podczas gdy tak nie jest
tj. w drugim przypadku
ffprobe out.avi -show_entries format=duration -v 0
źródło