Jak przekonwertować animowany gif na mp4 lub mv4 w wierszu poleceń?

79

Jakiego polecenia użyłbym do przekonwertowania pliku wideo mp4 lub mv4 na animowany gif i odwrotnie. Oznacza to konwersję animowanego gifa na mp4 lub mv4.

Gilles
źródło

Odpowiedzi:

107

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

Vico Vault
źródło
4
Dzięki, to jest jedyna wersja, która działała dla mnie na osx.
Pykler
1
To działało dla mnie na Ubuntu 16.10 z ffmpeg 3.0.2, gdzie najlepsza odpowiedź nie zadziałała
kot
1
Może także przyciąć zamiast skalowania (wymienić scalez crop), jak jesteś tylko będzie odcięcie co najwyżej 1 piksel. Skalowanie może powodować rozmycie
Jezzamon
To odcięło mi ostatnie kilka sekund. Wynikowe MP4 zakończyło się wcześnie.
callum
38

W moim przypadku skorzystanie ffmpegbezpośrednio z tej sztuczki zapewniło najlepszy wynik:

$ ffmpeg -f gif -i infile.gif outfile.mp4
BenC
źródło
2
wyprodukował pusty (uszkodzony) film na os x
Pykler
2
@Pykler prawdopodobnie powinieneś zwiększyć gadatliwość i / lub sprawdzić plik dziennika, aby zrozumieć, co się dzieje.
BenC
Ja też, prawdopodobnie „podzielny przez 2 wymiary” sugeruje odpowiedź vico Vault. (co dla mnie zadziałało)
lapo
Ta metoda działała dla mnie idealnie. (Najlepsza odpowiedź spowodowała odcięcie 3 sekund.) EDYCJA: och, ale nie gra na iOS :(
callum
Strona mówi, należy po prostu dodać -pix_fmt yuv420p
beefeather
2

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ść.

użytkownik8547
źródło
2

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]

PYK
źródło
Jeśli uruchomisz pierwsze ffmpegpolecenie bez -y , będziesz mieć znacznie mniejsze szanse na przypadkowe zastąpienie czegoś, czego nie chcesz. ( Prawdopodobnie istnieje również sposób na ffmpegprzesłanie wideo do siebie i zrobienie tego jednym poleceniem bez pliku pośredniego i nadpisywania).
FeRD