Bagaimana cara membuat GIF animasi dari video MP4 melalui baris perintah?

119

Saya ingin membuat animasi .gifdari .mp4video. Saya lebih suka melakukannya dari baris perintah, jadi tolong hanya daftar alat baris perintah.

Maythux
sumber
Anda dapat menggunakan skrip ini di Github yang menggunakan FFMPEG dan menghasilkan palet warna menengah untuk kualitas gambar yang lebih baik.
troyane

Jawaban:

128

ffmpeg 3.4.4 dapat melakukannya secara langsung di Ubuntu 18.04

Anda mungkin ingin menggunakan sesuatu seperti:

sudo apt-get install ffmpeg
wget -O opengl-rotating-triangle.mp4 https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.mp4?raw=true
ulimit -Sv 1000000
ffmpeg \
  -i opengl-rotating-triangle.mp4 \
  -r 15 \
  -vf scale=512:-1 \
  -ss 00:00:03 -to 00:00:06 \
  opengl-rotating-triangle.gif

Prosedur pembuatan data uji dijelaskan pada posting ini .

Yang lebih langsung:

sudo apt-get install ffmpeg
ffmpeg -i in.mp4 out.gif

juga berfungsi, tetapi output GIF akan jauh lebih besar dari input video, karena format video kompres secara cerdas di seluruh frame.

Rincian argumen:

  • ulimit -Sv 1000000: setel ukuran memori maksimum 1Gb untuk program.

    Kebanyakan saya memastikan bahwa perintah tersebut tidak menggunakan memori tidak terbatas seperti upaya-upaya tertentu sebelumnya.

    500Mb membuat ffmpeg gagal memuat pustaka bersama ... waktu untuk meningkatkan RAM Anda?

  • -ss 00:00:03 -to 00:00:06: mulai dan akhiri waktu untuk memotong video.

    Tidak, GIF bukanlah cara terbaik untuk membajak video secara online.

    Lihat juga: https://stackoverflow.com/questions/18444194/cutting-the-videos-based-on-start-and-end-time-using-ffmpeg

  • -vf scale=512:-1: buat 512tingginya piksel keluaran , dan sesuaikan lebar untuk mempertahankan rasio aspek.

    Ini adalah kasus penggunaan umum untuk gambar untuk web, yang cenderung memiliki resolusi jauh lebih kecil daripada video.

    Jika Anda menghapus opsi ini, GIF output memiliki ketinggian yang sama dengan video input.

    Ketinggian video asli dapat ditemukan misalnya dengan ffprobe: https://superuser.com/questions/595177/how-to-retrieve-video-file-information-from-command-line-under-linux/1035178#1035178 dan 1024 x 1024 dalam kasus kami.

  • -r 15: sampling FPS.

    Misalnya, video asli adalah 30 FPS, jadi itu -r 15berarti ffmpegakan memilih satu frame di setiap 2 ( = 30 / 15).

    Namun, output FPS yang disesuaikan disesuaikan dengan input, sehingga Anda tidak akan melihat peningkatan, hanya rincian yang lebih besar.

    Input FPS dapat ditemukan dengan ffprobe, dan jumlah total frame input dapat ditemukan dengan mediainfosebagaimana dijelaskan di: https://superuser.com/questions/84631/how-do-i-get-the-number-of-frames -in-a-video-di-linux-command-line / 1044894 # 1044894

    Saya merekomendasikan opsi ini karena format video biasanya memiliki framerate yang lebih tinggi karena resolusi yang lebih besar. Dengan GIF yang lebih kecil, framerate yang lebih rendah kurang terlihat, sehingga kita dapat melewatkan beberapa frame dan membuat GIF yang lebih kecil.

Sebelum pra 18.04: ffmpeg+ convertsatu liner tanpa file perantara

ffmpegtidak dapat menangani GIF sebelumnya. Yang terbaik yang saya miliki adalah sesuatu:

sudo apt-get install ffmpeg imagemagick
ffmpeg -i input.mp4 -r 10 -f image2pipe -vcodec ppm - | \
  convert -delay 5 -loop 0 - output.gif

Penjelasan dari beberapa argumen:

Sekalipun Anda mengurangi ketinggian dan framerate, output GIF mungkin masih lebih besar dari video, karena format video non-GIF "asli" mengkompresi di seluruh frame, sementara GIF hanya memampatkan frame individual.

A direct:

convert input.mp4 rpi2-bare-metal-blink.gif

bekerja, tetapi hampir membunuh komputer saya karena memory overflow, dan menghasilkan ouptput 100x lebih besar untuk file input 2s 1Mb saya. Mungkin suatu hari ImageMagick akan menyusul.

Lihat juga: https://superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-using-ffmpeg-with-reasonable-quality

Diuji pada Ubuntu 17.10.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber
1
Para downvoter harap jelaskan ;-)
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
1
Penundaan Anda tidak cocok dengan nilai -r Anda (gif yang dihasilkan adalah kecepatan 2x). Anda juga menambahkan argumen skala tanpa alasan yang jelas (itu membuat gif sangat kecil).
penanggung jawab
2
Saya setuju. Gif ukuran kecil lebih baik untuk web. Terima kasih untuk scale=320:-1
zombic
2
Bagi mereka yang bertanya-tanya: melepas -r 10akan membawa GIF kembali ke kecepatan normal.
Mitch
2
Saya mendapat gif 20% lebih besar dari mp4: O
Adam Goldman
113

Dua langkah:

  • Ekstrak Gambar dari Video

    Buat direktori bernama bingkai di direktori yang sama dengan .mp4file Anda . Gunakan perintah:

    ffmpeg -i video.mp4  -r 5 'frames/frame-%03d.jpg'
    


    -r 5 stands for FPS value
        for better quality choose bigger number
        adjust the value with the -delay in 2nd step
        to keep the same animation speed
    
    %03d gives sequential filename number in decimal form
    

    sumber

  • Konversi Gambar ke gif

    cd frames
    convert -delay 20 -loop 0 *.jpg myimage.gif
    


    -delay 20 means the time between each frame is 0.2 seconds
       which match 5 fps above.
       When choosing this value
           1 = 100 fps
           2 = 50 fps
           4 = 25 fps
           5 = 20 fps
           10 = 10 fps
           20 = 5 fps
           25 = 4 fps
           50 = 2 fps
           100 = 1 fps
           in general 100/delay = fps
    
    -loop 0 means repeat forever
    

    Documents: konversi opsi gif

Anda akan berakhir dengan file yang agak besar, lihat panduan sulap gambar untuk mengoptimalkan opsi gif yang dapat Anda tambahkan ke perintah langkah kedua untuk mendapatkan file yang lebih kecil.

Maythux
sumber
1
jawaban yang bagus - beberapa info tambahan: ffmpeg dapat diinstal menggunakan petunjuk di sini
chepyle
3
Ingatlah bahwa framesfolder harus ada agar perintah pertama berfungsi.
totymedli
3
Bagi mereka yang menginginkan cara cepat untuk mengoptimalkan yang umumnya berfungsi dan terlalu malas untuk membaca tautan, tambahkan saja -layers Optimizeke convertperintah terakhir , sebelumnya *.jpg. Periksa outputnya, mungkin terpengaruh. Bagi saya itu mengurangi ukuran gif dari 5 MB menjadi 700 KB tanpa ada penurunan kualitas :)
cpury
Terima kasih itu adalah proses yang menarik, mp4 5,6MB menghasilkan 236MB gif, tidak yakin saya akan meletakkannya di situs web saya;) Mungkin gif perlu dibatasi hingga detik, bukannya satu menit.
cardamom
2
Alih-alih menggunakan format file JPG, sangat lossy dengan pengaturan default, saya akan merekomendasikan menggunakan PNG untuk ekspor file awal. ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'.
Pierre F
12

gifify adalah utilitas berbasis simpul all-in-one yang menyederhanakan konversi. Hal ini tergantung pada nodejs, npm, ffmpeg, dan imagemagickyang semuanya tersedia di repo.

Setelah Anda npmmenginstal, Anda dapat menginstal gififysecara global dengan:

    npm install -g gifify

Video dapat dikonversi ke .GIF dengan:

    gifify video.mp4 -o video.gif

Anda juga dapat secara opsional mengatur posisi awal dan akhir dalam video dan menambahkan teks:

    gifify clip.mp4 -o clip.gif --from 01:48:23.200 --to 01:48:25.300 --text 'we are the knights who say nip!'

❗️ Diperlukan beberapa menit agar konversi selesai bahkan dengan video yang lebih kecil.

CATATAN: ffmpegdan imagemagickmungkin perlu dikompilasi dengan beberapa perpustakaan tertentu (yaitu libass dan fontconfig yang sesuai).

ccpizza
sumber
Tidak menangani kira-kira> klip 40 detik: github.com/vvo/gifify/issues/99
oligofren
19.04: Paket lain yang diperlukan adalah gifsicle, tetapi kemudian masalah lain terjadi: github.com/vvo/gifify/issues/95 Juga, apakah Anda keberatan memberi tahu kami npm novis di direktori mana yang akan dijalankan npm installdan apakah menjalankannya sebagai root atau tidak? Terima kasih!
Nicolas Raoul