Mam folder pełen filmów, które chcę przekonwertować na animowane gify. ffmpeg / avconv robi złą robotę, robiąc to bezpośrednio, więc zamiast tego przekonwertowałem wideo na gif, najpierw wysyłając każdą klatkę jako png, a następnie konwertując z powrotem na gif za pomocą imagemagick. Problem polega na tym, że powoduje to duży gif pod względem wielkości pliku. Aby rozwiązać ten problem, chcę „upuszczać” co sekundę lub n-tą klatkę z gif, albo pomijając każdy plik obrazu podczas konwersji do gif, albo usuwając klatki z gif. Jak mogę to zrobić w systemie Ubuntu (13.04) za pomocą imagemagick lub innego narzędzia wiersza polecenia?
źródło
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"
zrobisz to za jednym razem.chmod +x gifdrop.sh
Oto prostsze rozwiązanie z użyciem gifsicle niż skrypt JohnB:
To polecenie powinno działać w większości powłok uniksowych; Przetestowałem to w bashu. Wymień
input.gif
ioutput.gif
z nazwami plików wejściowych i wyjście, a99
wraz z liczbą klatek animacji. (Można użyć większej liczby, ale gifsicle narzeka na to.)Niektóre uwagi:
-U
Przełącznik połączą klatek animacji wejściowego z tych poprzednich, tak że każdy klatki stoi sam i nie zależy w żadnym innym. Naprawdę chcesz to zrobić, zanim zrobisz prawie wszystko z animacjami, w przeciwnym razie możesz uzyskać niechlujne wyniki. (Jeśli twoja animacja wejściowa jest już niezoptymalizowana, gifsicle może wydrukować ostrzeżenie o tym, ale jest to również całkowicie nieszkodliwe).Natomiast
-O2
przełącznik ponownie optymalizuje animację wyjściową, aby zminimalizować rozmiar pliku. Dzięki przykładowej animacji JohnB zmniejsza rozmiar wyjściowy o 27%.seq
Komenda właśnie wysyła ciąg liczb od 0 do 99, licząc się z krokiem 2.-f "#%g"
czyni go wydrukować#
przed każdym numerem, co sprawia gifsicle zrozumieć go jako selekcji ramki zamiast nazwy pliku. Backticks (`
) wokół polecenia seq powodują, że jego dane wyjściowe są uwzględniane jako parametry w wierszu polecenia gifsicle.Jeśli nie chcesz, aby gif przyspieszył, możesz użyć,
gifsicle -I input.gif
aby uzyskać bieżące opóźnienie ramki, pomnożyć je przez 2 i użyćgifsicle -d ${delay} ...
.źródło
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
. Zrobiłem to w dwóch krokach (z poziomu Git Bash): 1.gifsicle -U -o unoptimized.gif input.gif
2.gifsicle unoptimized.gif `seq -f "#%g" 0 2 99` -O2 -o output.gif
Korzystanie z Photoshopa
Nie jest to rozwiązanie typu open source lub wiersza poleceń, ale można to zrobić za pomocą programu Photoshop:
Plik ▸ Importuj ▸ Ramki wideo do warstw ...
„ Limit do każdego __ Frames ” załatwi dla Ciebie
źródło
Oto moje rozwiązanie wykorzystujące przetwarzanie skryptów wsadowych ...
Najpierw skopiuj przechwycony-oryginalny animowany gif do pliku input.gif, a następnie uruchom interpreter poleceń i wpisz:
gifsicle input.gif -I "# -1"> input.txt
zajrzyj do input.txt i zobacz, jaka jest długość animacji - ile klatek zawiera ...
input.txt:
następnie edytuj-utwórz test.bat i zmień wartość zmiennej len = określ_lość_numer_od_wejścia.txt i zapisz test.bat ...
test.bat:
następnie w końcu uruchom proces1.bat i proces2.bat i przycięta animacja z każdą nieparzystą klatką zostanie przetworzona do pliku input.gif
proces1.bat:
process2.bat:
źródło
Myślę, że potrzebuję nowego, bardziej złożonego wyjaśnienia (opóźnienie ramki jest również ważną rzeczą, którą również należy wziąć pod uwagę) ... W tym nowym procesie musisz pobrać JREPL.BAT z tego linku: http://www.dostips.com /forum/viewtopic.php?t=6044
Najpierw skopiuj przechwycony gif do pliku input.gif, a następnie uruchom interpreter poleceń i wpisz:
gifsicle input.gif -I "# -1"> input.txt
spójrz na input.txt i zobacz, jaka jest długość animacji - ile klatek zawiera ... również sprawdź opóźnienie klatki i jeśli jej 0.07s oznacza, że powinieneś wstawić opcję -d14 (7 ms * 2) w tym wierszu w process.cmd: gifsicle -b -U -d14 input.gif, po edycji zapisz proces.cmd
następnie edytuj test.bat i zmień wartość zmiennej 166 z tego wiersza, aby dopasować ją do liczby klatek animacji: for / L %% i IN (1,2,166) DO echa "# %% i" >> input.bat, po edytuj zapisz test.bat ...
następnie uruchom process.cmd i przycięte animacje z każdą nieparzystą klatką zostaną przetworzone do pliku input.gif
PS Zaletą tej metody jest również to, że masz pełną kontrolę nad tym, co chcesz usunąć z gif (co druga klatka (1,2,166) lub co trzecia (1,3,166)) i tak dalej, po prostu zmień środkową liczbę w linia wsadowa, ale pamiętaj, że jeśli podasz (1,3,166), odpowiednio zmień -d14 (opcja opóźnienia) z process.cmd, aby odzwierciedlić zmianę (7 ms * 3/2 = 10), więc zamiast (7 ms * 2 / 1 = 14), opcja opóźnienia powinna wynosić -d10 ...
Inne pliki (na przykład usuwanie co drugą klatkę): test.bat:
process.cmd:
I plik pomocniczy readme input.txt:
źródło