수천 개의 .png 파일을 애니메이션 .gif 파일로 변환합니다.`convert`는 너무 많은 메모리를 사용합니다


28

png 이미지 세트에서 애니메이션 GIF 를 만드는 방법을 묻는 많은 질문 은 ImageMagick 명령 의 변형을 사용하는 것이 좋습니다 . convert

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

그러나 수천 개의 이미지 가 있으므로 convert모든 메모리 를 사용하고 스왑 한 다음 충돌합니다. 메모리를 더 인식하는 대체 소프트웨어는 무엇입니까? .gif지원되지 않는 경우 다른 개방 형식을 사용할 수 있으며 CLI 도구를 선호합니다.


1
* .png 파일을 관리 가능한 덩어리로 나누는 것은 어떻습니까? 모든 파일 이름이 숫자로 시작한다고 가정 convert -delay 2 -loop 0 0*.png animated.gif하면 '0'으로 시작하는 파일 만 변환됩니다. 등등.
Jos

2
따라서 각 .png는 1Mb의 순서입니까? 이 경우, 내가 생각할 수있는 것은 먼저 .png 파일을 더 낮은 해상도 또는 색 농도로 변환하여 더 작게 만드는 것입니다.
Jos

10
다른 열린 형식을 사용할 수 있다고 말합니다. gif는 수천 개의 프레임에 가장 적합한 형식은 아닙니다. Ogg Theora를 사용하여 비디오 인코딩을 고려해 보셨습니까?
rekado

1
GIF를 정말로 사용하고 싶다면 gifsicle을 살펴보십시오 . (다른 사람이 말했듯이,하지만,이 GIF를 위해 만들어진 것이 아니다, OGG가 더 나은 선택이 될 것입니다.)
wchargin

1
레. "모든 메모리가가는 곳": 65 Kb는 압축 된 이미지의 파일 크기입니다. 압축되지 않은 이미지는 대략 4 x 너비 x 높이 바이트를 사용하므로 1024x768 이미지는 ~ 3Mb의 RAM을 사용합니다. "수천"을 곱하면 메모리가 어디로 가는지 알 수 있습니다.
Sergey

답변:


33

비디오를 만들려고하는 것 같습니다. 이 경우 적절한 비디오 형식을 사용합니다.

이 경우 ffmpeg 를 사용 하여 개별 PNG 파일을 H.264 비디오로 변환합니다. ffmpeg는 몇 시간이 걸릴 수있는 비디오를 사용하도록 만들어 졌으므로 수천 개의 이미지에는 문제가 없습니다. 애니메이션 GIF 대신 H.264를 사용하면 이미지 품질 이 크게 향상됩니다.

이 같은 것이 당신을 위해 작동해야합니다 :

 ffmpeg -framerate 1/2 -i img%04d.png -c:v libx264 -r 30 out.mp4
  • -framerate 1/2: 프레임 속도를 1/2 FPS 또는 프레임 당 2 초로 설정합니다.
  • -i img%04d.png:이 파일을 읽을 수는 FFmpeg 알 수 img0000.png있지만 img9999.png.
  • -c:v libx264: 비디오 코덱 libx264를 사용하십시오.
    • 원하는 경우 비디오 압축 매개 변수를 여기에 지정할 수 있습니다.
    • -crf <number>: 품질 설정. 0에서 51까지입니다. 23이 기본값입니다. 0은 진정한 무손실 인코딩이며, 이는 상당히 높은 대역폭입니다. 18은 거의 시각적으로 무손실입니다.
  • -r 30: 출력 프레임 속도를 30FPS로 설정하십시오. 각 입력 이미지가 복제되어 여기에서 지정한대로 출력됩니다. 이 매개 변수를 끄면 출력 파일이 입력 프레임 속도에있게되지만 지금 시도했을 때 결과 동영상이 제대로 표시되지 않습니다.
  • out.mp4: 출력 파일 이름.

참고 문헌 :


1
전날부터 Frantique 답변의 멋진 확장.
Geek

여기에 콘크리트 테스트 데이터와 ImageMagick이 벤치 마크 대비 간단한의는 FFmpeg은 다음과 같습니다 askubuntu.com/questions/648244/...
치로 틸리新疆改造中心法轮功六四事件

11

개인적으로 한 번에 제한된 수의 파일로 시작하는 것입니다. 예를 들면 다음과 같습니다.

#!/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

8

사용 -limit memory 1GiB메모리의 양을 제한하기 위해 convert사용합니다.

수천 개의 이미지는 대부분의 컴퓨터에서 표시하기 어려운 큰 GIF를 생성합니다. 가능한 경우 애니메이션 GIF를 200 개 미만의 이미지로 유지합니다. 적을수록 좋습니다. 이미지 번호를 매길 경우이 명령은 홀수 번호의 이미지를 삭제합니다 rm *[13579].png.

영화 장면에서 애니메이션 GIF를 만드는 일반적인 작업 과정은 다음과 같습니다.

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

1
고맙습니다. 그 솔루션은 잘 작동합니다. /etc/ImageMagick-6/policy.xml에서 허용 된 메모리 제한을 늘려야 할 수도 있습니다. 자세한 내용은 github.com/ImageMagick/ImageMagick/issues/… 를 참조하십시오
Louis Gagnon

4

.gif지원되지 않으면 다른 개방 형식을 사용할 수 있습니다

아마도 APNG 가 당신에게 사용 중일 것입니다. Firefox를 포함한 일부 브라우저 에서 지원 되지만 현재 Chrome 및 IE는 제외됩니다. PNG 확장자 일 뿐이므로 PNG를 APNG로 변환하는 것은 매우 간단합니다. apngasm의 도구는 그렇게 할 수 있습니다. 그러나 형식이 너무 간단하여 최근 Sage를 위해 APNG 어셈블러를 직접 작성했습니다. 해당 코드를 채택 하는 것이 대안이 될 수 있습니다.


또한 APNG는 비표준이며 7 년 동안 사용해 왔지만 여전히 애매 모호하다고 지적하고 싶습니다.
Pharap

사용 된 브라우저를 선택할 수있는 과학적인 데모의 경우 여전히 간단하고 강력한 솔루션 일 수 있습니다.
MvG

누가 데모를보아야하는지에 달려 있습니다. 시청자에게 사본을 나누어주는 것이 좋지 않을 것입니다. 그러면 2/3가 파이어 폭스를 다운로드하여 다운로드해야합니다. 중요한 과학적 시연을 할 때하고 싶은 인상은 없습니다. 그것이 시연의 일부로 만 보려고 의도 된 경우 충분히 공정하지만 다른 상황에는 적합하지 않을 수 있습니다.
Pharap

3

수천 개의 png-s가 있다면 anigif 형식이 이상합니다. 나는 이것을 사용하여 avconv다음 과 같이 할 것이다 :

 avconv -i "%d.png" -r 25 -c:v libx264 -crf 20 -pix_fmt yuv420p animated.mov

이 접근 방식은 나중에 그래픽 인터체인지 형식으로는 불가능한 보이스 오버 또는 음악 오디오에서 멀티플렉싱 할 수 있다는 추가 이점이 있습니다.
Geek

2

gifsicle 은 GIF 애니메이션을 처리하는 명령 줄 유틸리티입니다. 메모리를 빠른 속도로 교환하려는 경우 --conserve-memory 스위치를 사용할 수 있습니다.


내가 이런 식으로 넣어 보자 : gifsicle 이미 ImageMagick과보다 작은 풋 프린트를 가지고 - 당신은 여전히 손에 작업에 너무 많은 메모리를 사용하는 것을 발견하는 경우, 다음 당신은 --conserve 메모리 사용할 수 있습니다
codehead

오, 나는 당신이 말한 것을 잘못 읽은 것으로 생각합니다. 스위치가 더 많은 메모리를 사용할 것이라고 생각합니다. 신경 쓰지 마.
curiousdannii

2

다른 답변 외에도 GIF 파일을 만들고 싶기 때문에 웹 페이지에 이미지를 표시한다고 가정합니다. 그렇다면 PNG를 전혀 변환하지 않아도됩니다. "자바 스크립트 슬라이드 쇼"를 Google로 검색하고 수백만 개의 무료 스크립트 중 하나를 사용하십시오. 또는 직접 작성하십시오. 이것은 사소한 것입니다.

이런 식으로 수행하면 다음과 같은 이점이 있습니다.

  • 한 번에 하나의 이미지 만 브라우저에로드되면 슬라이드 쇼가 빠르게 시작되고 사용자 컴퓨터에서 많은 RAM을 소비하지 않습니다.

  • 솔루션은 수백만 개의 이미지로 확장됩니다. 또는 수십억, 만약 당신이 그들 모두를 볼만큼 인내심이 있다면 :)

  • 페이지에 컨트롤을 추가하여 일시 중지, 되감기, 지연 변경 또는 특정 프레임으로 이동할 수 있습니다.


세르게이 감사합니다. 실제로 이것은 웹 페이지에 표시되지 않습니다. 그래도 아이디어는 +1입니다.
dotancohen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.