何千もの.pngをアニメーション化された.gifに変換し、 `convert`はメモリを使いすぎます


29

一連の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」で始まるファイルのみが変換されるとします。等々。
ジョス

2
各.pngは1 Mbのオーダーですか?その場合、最初に.pngファイルをより低い解像度または色深度に変換して、サイズを小さくすることしか考えられません。
ジョス

10
別のオープン形式を使用できると言います。gifは、何千ものフレームに最適な形式ではないようです。代わりにOgg Theoraでビデオをエンコードすることを検討しましたか?
レカド

1
本当にGIFを使いたいのなら、おそらくgifsicleを見てください。(ただし、他の人が言ったように、これはGIFの目的ではありません
。OGGの

1
Re。「すべてのメモリの行き先」:65 Kbは、圧縮画像のファイルサイズです。圧縮されていない場合、画像は約4 x幅x高さのバイトを必要とするため、1024x768の画像は約3MbのRAMを必要とします。メモリが起こっている場所を「数千」で、あなたが表示されますことを乗算...
セルゲイ

回答:


33

ビデオを作成しようとしているようです。その場合は、適切なビデオ形式を使用します。

この場合、ffmpegを使用して個々のPNGファイルをH.264ビデオに変換します。ffmpegは数時間かかる可能性のあるビデオで動作するように作られているため、数千の画像に問題はないはずです。H.264の代わりに、アニメーションGIFを使用することになります広大な画像品質の向上。

このような何かがあなたのために働くはずです:

 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:出力フレームレートを30 FPSに設定します。ここで指定したものを出力するために、各入力画像が複製されます。このパラメーターをオフのままにすると、出力ファイルは入力フレームレートになりますが、結果のムービーは今試したときに正しく表示されませんでした。
  • out.mp4:出力ファイル名。

参照:


1
前日からのFrantiqueの回答の素晴らしい展開。
オタク長老

以下に、具体的なテストデータを使用したImageMagickベンチマークとffmpegの簡単なベンチマークを示します。askubuntu.com
Ciro Santilli新疆改造中心法轮功六四事件

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使用量を制限します。

1000枚の画像は、ほとんどのコンピューターで表示に苦労する巨大な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/...の詳細は
ルイ・ガニオン

4

.gifサポートされていない場合は、別のオープン形式を使用できます

おそらくAPNG役に立つでしょう。Firefoxを含む一部のブラウザーでサポートされていますが、現時点ではChromeとIEを除きます。これは単なるPNG拡張機能であるため、PNG をAPNGに変換するのは非常に簡単です。apngasmのツールはそれを行うことができます。しかし、フォーマットは非常に単純なので、最近、Sage向けにAPNGアセンブラーを自分で作成しました。そのコードを適応させることは代替案です。


また、APNGは非標準であり、7年間存在したにもかかわらず、非常に不明瞭であることを指摘したいと思います。
ファラプ

科学的なデモンストレーションでは、使用するブラウザーを選択できる可能性がありますが、これは依然としてシンプルで堅牢なソリューションです。
MvG

誰がデモを見る必要があるかによります。コピーを視聴者に渡すのはあまり良くないので、3分の2がそれを見るためだけにFirefoxをダウンロードする必要があります。私が重要な科学的デモンストレーションを行っていた場合、私が作りたいような印象はありません。デモンストレーションの一部として表示することのみを目的としている場合は十分に公平ですが、他の状況には適さない可能性があります。
ファラプ

3

数千のpng-sがある場合、anigif形式は奇妙です。私はこのようにして、以下を使用しavconvます:

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

このアプローチには、後でグラフィックスインターチェンジ形式では不可能なボイスオーバーまたは音楽オーディオを多重化できるという追加の利点があります。
オタク長老

2

gifsicleは、GIFアニメーションを処理するコマンドラインユーティリティです。メモリをスピードと引き換えに使用する場合は、-conserve-memoryスイッチを使用できます。


私はこのようにそれを入れてみましょう:gifsicleはすでにImageMagickのより小さなフットプリントを持っている-あなたはそれがまだ手元にあるタスクのためにあまりにも多くのメモリを使用していることを発見した場合、その後、あなたは--conserve・メモリを使用することができます
codehead

ああ、私はあなたが言っていることを読み違えていると思う、スイッチはより多くのメモリを使用するだろう、それはあまり意味をなさない。気にしないで。
curiousdannii

2

他の答えに加えて:GIFファイルを作成したいので、Webページに画像を表示したいと思います。もしそうなら、私はあなたのPNGをまったく気にしません。「javascript slideshow」をグーグルで検索し、数百万の無料スクリプトのいずれかを使用します。または、独自に作成します。これは本当に簡単です。

この方法で行う利点は次のとおりです。

  • ブラウザには常に1つの画像のみが読み込まれ、スライドショーは高速で開始され、ユーザーのマシンのRAMをあまり消費しません。

  • このソリューションは数百万の画像に対応します。数十億、あなたがそれらすべてを見るのに十分忍耐強いなら:)

  • ページにコントロールを追加して、一時停止、巻き戻し、遅延の変更、または特定のフレームに移動できます。


ありがとう、セルゲイ。実際、これはWebページに表示するためのものではありません。ただし、アイデアは+1。
dotancohen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.