Konwertuj tysiące .pngs do animowanego .gif, "konwertuj" używa za dużo pamięci

21

Wiele z pytania z pytaniem jak stworzyć < a href="#" > animowany gif z zestawu of png images proponuję użyj wariantu polecenia convert ImageMagick:

convert -delay 2 -loop 0 *.png animated.gif

Jednak mam kilka tysięcy zdjęć , a więc convert zużywa całą moją pamięć, zamienia, a następnie zawiesza się. Jakie istnieje alternatywne oprogramowanie, które ma więcej pamięci? Mogę użyć innego otwartego formatu, jeśli .gif nie jest obsługiwany, a ja wolę narzędzie CLI.

    
zadawane dotancohen 14.01.2015, 14:38
źródło

7 odpowiedzi

28

Wygląda na to, że próbujesz zrobić film. Jeśli tak, to użyłbym odpowiedniego formatu wideo.

W tym przypadku użyłbym ffmpeg do konwersji pojedynczych plików PNG na wideo w formacie H.264. Ponieważ ffmpeg jest przeznaczony do pracy z filmami, które mogą trwać wiele godzin, nie powinien mieć problemu z tysiącami zdjęć. Używanie H.264 zamiast animowanego gifa spowoduje rozległą poprawę jakości obrazu.

Coś takiego powinno ci się udać:

 ffmpeg -framerate 1/2 -i img%04d.png -c:v libx264 -r 30 out.mp4
  • -framerate 1/2 : Ustawia szybkość klatek na sekundę FPS lub 2 sekundy na klatkę.
  • -i img%04d.png : Dzięki temu ffmpeg odczyta pliki img0000.png przez img9999.png .
  • -c:v libx264 : Użyj kodeku wideo libx264.
    • Tutaj możesz określić parametry kompresji wideo, jeśli chcesz:
    • -crf <number> : Ustawienie jakości. 0 do 51. 23 jest domyślne. 0 to prawdziwe kodowanie bezstratne, które będzie dość wysoką przepustowością. 18 jest prawie wizualnie bezstratny.
  • -r 30 : Ustaw prędkość klatek na sekundę na 30 FPS. Każdy z obrazów wejściowych zostanie zduplikowany, aby uzyskać wynik, który tutaj określisz. Możesz wyłączyć ten parametr, a plik wyjściowy będzie na wejściowej liczbie klatek na sekundę, ale wynikowy film nie wyświetlił się poprawnie, gdy wypróbowałem go właśnie teraz.
  • out.mp4 : Nazwa pliku wyjściowego.

Piśmiennictwo:

odpowiedział David Yaw 15.01.2015, 03:36
źródło
10

Osobiście po prostu uruchomiłbym go na ograniczonej liczbie plików zamiast wszystkich naraz. Na przykład coś takiego:

#!/usr/bin/env bash

## Collect all png files in the files array
files=( *png )
## How many should be done at once
batch=50

## Read the array in batches of $batch
for (( i=0; $i<${#files[@]}; i+=$batch ))
do
    ## Convert this batch
    convert -delay 2 -loop 0 "${files[@]:$i:$batch}" animated.$i.gif
done

## Now, merge them into a single file
convert  animated.*.gif all.gif
    
odpowiedział terdon 14.01.2015, 15:42
źródło
7

Użyj -limit memory 1GiB , aby ograniczyć ilość pamięci używanej przez convert .

Tysiące obrazów tworzyłyby wielki GIF, który większość komputerów będzie miała problemy z wyświetlaniem. W miarę możliwości utrzymuję animowane pliki GIF poniżej 200 obrazów. Im mniej, tym lepiej. Jeśli numerujesz swoje obrazy, to polecenie usunie obrazy o numerach nieparzystych rm *[13579].png .

Oto mój typowy przepływ pracy do tworzenia animowanego GIF-a ze sceny filmowej:

avconv -ss 00:26:00 -i someMovie.mpg %5d.png
rm  *[13579].png
convert -limit memory 1GiB -loop 0 -layers optimize -resize 400 *.png output.gif
    
odpowiedział PLA 20.01.2015, 19:59
źródło
3

Jeśli masz tysiące png-s, format anigifu jest dziwny. Zrobiłbym to w ten sposób, używając avconv :

 avconv -i "%d.png" -r 25 -c:v libx264 -crf 20 -pix_fmt yuv420p animated.mov
    
odpowiedział Frantique 14.01.2015, 14:55
źródło
3
  

Mogę użyć innego otwartego formatu, jeśli .gif nie jest obsługiwany

Być może APNG jest dla ciebie przydatny. Jest obsługiwany przez niektóre przeglądarki , w tym Firefox, ale w tej chwili z wyłączeniem Chrome i IE. Ponieważ jest to tylko rozszerzenie PNG, jest to bardzo proste do konwersji plików PNG do APNG. Może to zrobić narzędzie apngasm . Ale format jest tak prosty, że sam napisałem asembler APNG dla Sage. Dostosowanie tego kodu byłoby alternatywą.

    
odpowiedział MvG 14.01.2015, 17:27
źródło
2

Oprócz innych odpowiedzi: ponieważ chcesz utworzyć plik GIF, zakładam, że chcesz wyświetlić obraz na stronie internetowej. Jeśli tak, nie zawracałbym sobie głowy konwersją twoich plików PNG. Wystarczy google dla "pokazu slajdów javascript" i użyć jednego z milionów darmowych skryptów. Lub napisz własne, to naprawdę trywialne.

Korzyści z robienia tego w ten sposób są następujące:

  • tylko jeden obraz jest ładowany do przeglądarki w dowolnym momencie, pokaz slajdów uruchamia się szybko i nie zużywa dużo pamięci RAM na komputerze użytkownika.

  • rozwiązanie skaluje się do milionów obrazów. Lub miliardy, jeśli jesteś wystarczająco cierpliwy, aby obejrzeć je wszystkie:)

  • Możesz dodać kontrolki do swojej strony, aby wstrzymać, przewinąć, zmienić opóźnienie lub przejść do konkretnej ramki.

odpowiedział Sergey 20.01.2015, 22:01
źródło
1

gifsicle to narzędzie wiersza poleceń do obsługi animacji GIF. Jeśli chcesz zamieniać pamięć na szybkość, możesz użyć jej przełącznika --konserwacja pamięci.

    
odpowiedział codehead 15.01.2015, 03:13
źródło

Przeczytaj inne pytania na temat tagów