Saya memiliki folder yang penuh dengan video yang ingin saya konversi menjadi gif animasi. ffmpeg / avconv melakukan pekerjaan yang buruk dengan melakukannya secara langsung, jadi saya alih-alih mengkonversi video ke gif dengan terlebih dahulu mengeluarkan setiap frame sebagai png dan kemudian mengonversi kembali ke gif menggunakan imagemagick. Masalahnya adalah ini menghasilkan gif besar dalam hal ukuran file. Untuk mengatasi ini saya ingin "menjatuhkan" setiap detik atau frame ke-n dari gif, baik dengan melewatkan setiap file gambar saat mengkonversi ke sebuah gif atau dengan menghapus frame dari sebuah gif. Bagaimana saya bisa melakukan ini di Ubuntu (13.04) menggunakan imagemagick atau utilitas baris perintah lainnya?
sumber
let i=0; while [[ $i -lt $(($numframes / 2)) ]]; do gifsicle $2 --delete "#$i" -o $2; let i=i+1; done
gifsicle "$1" --unoptimize $(seq -f "#%g" 0 2 $numframes) -O2 -o "$2"
akan melakukannya dalam satu panggilan.chmod +x gifdrop.sh
Berikut ini solusi sederhana menggunakan gifsicle daripada skrip JohnB:
Perintah ini harus bekerja di sebagian besar shell Unix; Saya sudah mengujinya di bash. Ganti
input.gif
danoutput.gif
dengan nama file input dan output, dan99
dengan jumlah bingkai dalam animasi Anda. (Tidak apa-apa menggunakan nomor yang lebih besar, tetapi gifsicle akan mengeluh tentang hal itu.)Beberapa catatan:
The
-U
switch akan menggabungkan frame dalam animasi masukan dengan yang sebelumnya, sehingga setiap frame berdiri sendiri dan tidak tergantung pada orang lain. Anda benar-benar ingin melakukan ini sebelum melakukan hampir semua hal dengan animasi, jika tidak Anda akan mendapatkan hasil yang berantakan. (Jika animasi input Anda sudah tidak dioptimalkan, gifsicle dapat mencetak peringatan tentang itu, tetapi ini juga sama sekali tidak berbahaya.)Sebaliknya,
-O2
sakelar kembali mengoptimalkan animasi keluaran untuk meminimalkan ukuran file. Dengan sampel animasi JohnB, ukuran output menyusut sebesar 27%.The
seq
perintah hanya output urutan angka dari 0 sampai 99, menghitung sampai di langkah 2.-f "#%g"
merek itu mencetak#
sebelum setiap nomor, yang membuatnya gifsicle memahaminya sebagai pilihan bingkai bukan nama file. Backticks (`
) di sekitar perintah seq menyebabkan outputnya dimasukkan sebagai parameter dalam baris perintah gifsicle.Jika Anda tidak ingin gif untuk mempercepat, Anda dapat menggunakan
gifsicle -I input.gif
untuk mendapatkan penundaan frame saat ini, kalikan dengan 2 dan gunakangifsicle -d ${delay} ...
.sumber
gifsicle input.gif `seq -f "#%g" 0 2 $(identify input.gif | tail -1 | cut -d "[" -f2 - | cut -d "]" -f1 -)` --unoptimize -O2 -o output.gif
useless unoptimization-related input option
. Jadi saya melakukannya dalam dua langkah (dari dalam Git Bash): 1.gifsicle -U -o unoptimized.gif input.gif
2.gifsicle unoptimized.gif `seq -f "#%g" 0 2 99` -O2 -o output.gif
Menggunakan Photoshop
Ini bukan solusi open source atau command line, tetapi Anda bisa melakukan ini dengan Photoshop:
File ▸ Impor ▸ Bingkai Video ke Lapisan ...
" Limit To Every __ Frames " akan melakukan trik untuk Anda
sumber
Berikut ini solusi saya menggunakan pemrosesan skrip batch ...
Pertama-tama salin gif animasi asli yang ditangkap ke dalam file input.gif kemudian mulai juru bahasa perintah dan ketik:
gifsicle input.gif -I "# -1"> input.txt
lihat input.txt dan lihat berapa panjang animasi - berapa banyak frame di dalamnya ...
input.txt:
kemudian edit-buat test.bat dan ubah nilai variabel len = define_length_number_from_input.txt dan simpan test.bat ...
test.bat:
kemudian akhirnya mulai process1.bat dan process2.bat dan potong animasi dengan setiap frame aneh akan diproses menjadi file input.gif
process1.bat:
process2.bat:
sumber
Saya pikir saya perlu penjelasan baru yang lebih canggih (frame delay juga hal penting yang harus dipertimbangkan juga) ... Untuk proses baru ini Anda perlu mengunduh JREPL.BAT dari tautan ini: http://www.dostips.com /forum/viewtopic.php?t=6044
Pertama-tama salin gif yang ditangkap ke dalam file input.gif kemudian mulai juru bahasa perintah dan ketik:
gifsicle input.gif -I "# -1"> input.txt
lihat input.txt dan lihat berapa panjang animasi - berapa banyak frame yang dikandungnya ... lihat juga penundaan frame dan apakah 0,07 itu berarti Anda harus meletakkan opsi -d14 (7msec * 2) ke dalam baris ini di process.cmd: gifsicle -b -U -d14 input.gif, setelah mengedit save process.cmd
kemudian edit test.bat dan ubah nilai variabel 166 dari baris ini agar sesuai dengan jumlah frame animasi: untuk / L %% i IN (1,2,166) DO echo "# %% i" >> input.bat, setelah edit save test.bat ...
kemudian mulai process.cmd dan potong animasi dengan setiap frame aneh akan diproses menjadi file input.gif
NB Keuntungan dari metode ini adalah juga bahwa Anda memiliki kontrol penuh atas apa yang ingin Anda hapus dari gif (setiap frame kedua (1,2,166), atau setiap ketiga (1,3,166)), dan sebagainya, cukup ubah nomor tengah di garis bets, tetapi perlu diketahui bahwa jika Anda menentukan (1,3,166), Anda harus mengubah -d14 (opsi penundaan) dari process.cmd untuk mencerminkan perubahan (7msec * 3/2 = 10), jadi alih-alih (7 msec * 2 / 1 = 14), opsi untuk penundaan harus -d10 ...
File lain (misalnya menghapus setiap frame kedua): test.bat:
process.cmd:
Dan file readme pembantu saya input.txt:
sumber