Odpowiedzi:
Oto, co zadziałało dla mnie:
ffmpeg -i animated.gif -movflags faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" video.mp4
movflags - Ta opcja optymalizuje strukturę pliku MP4, aby przeglądarka mogła go załadować tak szybko, jak to możliwe.
pix_fmt - filmy MP4 przechowują piksele w różnych formatach. Uwzględniamy tę opcję, aby określić konkretny format, który ma maksymalną kompatybilność we wszystkich przeglądarkach.
vf - filmy MP4 korzystające z H.264 muszą mieć wymiary, które można podzielić przez 2. Ta opcja zapewnia, że tak jest.
Źródło: http://rigor.com/blog/2015/12/optimizing-animated-gifs-with-html5-video
scale
z crop
), jak jesteś tylko będzie odcięcie co najwyżej 1 piksel. Skalowanie może powodować rozmycie
W moim przypadku skorzystanie ffmpeg
bezpośrednio z tej sztuczki zapewniło najlepszy wynik:
$ ffmpeg -f gif -i infile.gif outfile.mp4
Innym sposobem konwersji animacji GIF na wideo:
ffmpeg -i your_gif.gif -c:v libvpx -crf 12 -b:v 500K output.mp4
Wartości -crf mogą wynosić od 4 do 63. Niższe wartości oznaczają lepszą jakość. -b: v to maksymalna dozwolona przepływność. Wyższy oznacza lepszą jakość.
Jeśli chcesz stworzyć wyjście w „n pętlach” , spójrz na to rozwiązanie w jednym ujęciu
Przekształćmy więc plik normal.gif w loop.mp4
przykład filmu z 2 pętlami:
ffmpeg -stream_loop 2 -i normal.gif loop.gif -y;ffmpeg -i loop.gif -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" loop.mp4 -y
na przykład filmu z 5 pętlami:
ffmpeg -stream_loop 5 -i normal.gif loop.gif -y;ffmpeg -i loop.gif -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" loop.mp4 -y
UWAŻAJ: istnieje opcja -y [do zastąpienia]
ffmpeg
polecenie bez -y
, będziesz mieć znacznie mniejsze szanse na przypadkowe zastąpienie czegoś, czego nie chcesz. ( Prawdopodobnie istnieje również sposób na ffmpeg
przesłanie wideo do siebie i zrobienie tego jednym poleceniem bez pliku pośredniego i nadpisywania).
Wersja systemu MacO jest następująca:
$ ffmpeg -i input.avi -pix_fmt yuv420p output.mp4