コマンドライン経由でMP4ビデオからアニメーションGIFを作成する方法は?


回答:


128

ffmpeg 3.4.4はUbuntu 18.04で直接実行できます

次のようなものを使用する可能性があります。

sudo apt-get install ffmpeg
wget -O opengl-rotating-triangle.mp4 https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.mp4?raw=true
ulimit -Sv 1000000
ffmpeg \
  -i opengl-rotating-triangle.mp4 \
  -r 15 \
  -vf scale=512:-1 \
  -ss 00:00:03 -to 00:00:06 \
  opengl-rotating-triangle.gif

この投稿で説明されたテストデータ生成手順。

より直接的な:

sudo apt-get install ffmpeg
ffmpeg -i in.mp4 out.gif

動作しますが、ビデオ形式はフレーム間でインテリジェントに圧縮されるため、出力GIFは入力ビデオよりもはるかに大きくなります。

引数の内訳:

  • ulimit -Sv 1000000:プログラムの最大1Gbメモリサイズを設定します。

    ほとんどの場合、以前の特定の試行のようにコマンドが無制限のメモリを使用しないようにします。

    500MBでffmpegが共有ライブラリのロードに失敗する... RAMをアップグレードする時間ですか?

  • -ss 00:00:03 -to 00:00:06:ビデオをカットする開始時間と終了時間。

    いいえ、GIFは、オンラインで動画を海賊版にする最良の方法ではありません。

    参照:https : //stackoverflow.com/questions/18444194/cutting-the-videos-based-on-start-and-end-time-using-ffmpeg

  • -vf scale=512:-1:出力512ピクセルの高さを調整し、幅を調整してアスペクト比を維持します。

    これは、ビデオよりも解像度がはるかに低い傾向があるWebの画像の一般的な使用例です。

    このオプションを削除すると、出力GIFは入力ビデオと同じ高さになります。

    元のビデオの高さはで、たとえば見つけることができますffprobehttps://superuser.com/questions/595177/how-to-retrieve-video-file-information-from-command-line-under-linux/1035178#1035178とありますこの場合、1024 x 1024。

  • -r 15:FPSのサンプリング。

    例えば、元のビデオので、30 FPSた-r 15手段ffmpeg毎に2(1つのフレームを選択します= 30 / 15)。

    ただし、知覚される出力FPSは入力に一致するように調整されるため、スピードアップは見られず、粒度が大きくなるだけです。

    入力FPSはで見つけることができffprobe、入力フレームの合計数はhttps://superuser.com/questions/84631/how-do-i-get-the-number-of-framesでmediainfo説明されているように見つけることができます-in-a-video-on-the-linux-command-line / 1044894#1044894

    通常、ビデオ形式は解像度が高いためフレームレートが高いため、このオプションをお勧めします。小さいGIFでは、低いフレームレートは目立たないため、一部のフレームをスキップして小さいGIFを作成できます。

:事前18.04前にffmpeg+ convert中間ファイルなしのワンライナー

ffmpeg以前はGIFを処理できませんでした。私が持っていた最高のものは次のものでした:

sudo apt-get install ffmpeg imagemagick
ffmpeg -i input.mp4 -r 10 -f image2pipe -vcodec ppm - | \
  convert -delay 5 -loop 0 - output.gif

引数のいくつかの説明:

  • -loop 0:Netscape Gif拡張機能のループカウントフィールドを出力に追加します。で説明したように0が無限ループを意味しますhttp://www.vurdalakov.net/misc/gif/netscape-looping-application-extension eogfirefoxでもそれなしで、デフォルトでは、すべてのループ無限とクロム、私はそれどのように必要わからないんだけどもう

  • -delay 5:に記載されるように時間が、第二の100分に、次のフレームを表示する前に待って:https://en.wikipedia.org/wiki/GIF#Animated_GIFバイト324だから100、1 FPSを意味5意味します1 / 0.5 == 20FPS

「実際の」非GIFビデオ形式はフレーム全体を圧縮するのに対し、GIFは個々のフレームのみを圧縮するため、高さとフレームレートを小さくしても、出力GIFはビデオよりも大きくなる場合があります。

直接:

convert input.mp4 rpi2-bare-metal-blink.gif

動作しましたが、メモリオーバーフローが原因でコンピュータがほとんど死に、2秒1Mb入力ファイルに対して100倍の出力が生成されました。いつかImageMagickが追いつくかもしれません。

参照:https : //superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-using-ffmpeg-with-reasonable-quality

Ubuntu 17.10。でテスト済み。


1
Downvotersは説明してください;-)
Ciro Santilli新疆改造中心法轮功六四事件

1
遅延が-r値と一致しません(結果のgifは2倍の速度です)。また、明確な理由なしにスケール引数を追加しました(これにより、gifが本当に小さくなります)。
-asmeurer

2
同意する。小さいサイズのgifはWebに適しています。ありがとう scale=320:-1
-zombic

2
不思議に思う人のために:削除する-r 10とGIFは通常の速度に戻ります。
ミッチ

2
mp4より20%大きいgifを取得しました:O
Adam Goldman

113

2つのステップ:

  • ビデオから画像を抽出する

    .mp4ファイルと同じディレクトリに、framesというディレクトリを作成します。コマンドを使用:

    ffmpeg -i video.mp4  -r 5 'frames/frame-%03d.jpg'
    


    -r 5 stands for FPS value
        for better quality choose bigger number
        adjust the value with the -delay in 2nd step
        to keep the same animation speed
    
    %03d gives sequential filename number in decimal form
    

    ソース

  • 画像をgifに変換する

    cd frames
    convert -delay 20 -loop 0 *.jpg myimage.gif
    


    -delay 20 means the time between each frame is 0.2 seconds
       which match 5 fps above.
       When choosing this value
           1 = 100 fps
           2 = 50 fps
           4 = 25 fps
           5 = 20 fps
           10 = 10 fps
           20 = 5 fps
           25 = 4 fps
           50 = 2 fps
           100 = 1 fps
           in general 100/delay = fps
    
    -loop 0 means repeat forever
    

    ドキュメント:gifオプションの変換

最終的にはかなり大きなファイルになります。イメージマジックガイドを見て、2番目のステップコマンドに追加して小さいファイルを取得できるオプションのgifを最適化します。


1
素晴らしい
回答

3
frames最初のコマンドが機能するには、フォルダーが存在する必要があることに注意してください。
-totymedli

3
一般に機能し、リンクを読み取るのが面倒な最適化の迅速な方法が必要な場合は、直前-layers Optimizeの最後のconvertコマンドに追加してください*.jpg。ただし、出力を確認してください。影響を受ける可能性があります。私にとっては、GIFサイズを5 MBから700 KBに削減しましたが、品質をほとんど損なうことはありません
でした

おもしろいプロセスだったおかげで、5.6MBのmp4が236MBのgifになりました。これを自分のWebサイトに掲載するかどうかはわかりません;)おそらくgifは1分ではなく数秒に制限する必要があります。
カルダモン

2
デフォルト設定では非常に損失の多いJPGファイル形式を使用する代わりに、初期ファイルのエクスポートにPNGを使用することをお勧めします。ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'
ピエールF

12

gififyは、変換を簡素化するオールインワンのノードベースのユーティリティです。これは、依存nodejsnpmffmpeg、およびimagemagickすべてのリポジトリで利用可能です。

npmインストールが完了したら、次を使用してgififyグローバルにインストールできます。

    npm install -g gifify

ビデオは、次の方法で.GIFに変換できます。

    gifify video.mp4 -o video.gif

オプションで、ビデオの開始位置と終了位置を設定し、テキストキャプションを追加することもできます。

    gifify clip.mp4 -o clip.gif --from 01:48:23.200 --to 01:48:25.300 --text 'we are the knights who say nip!'

smaller️小さいビデオでも変換が完了するまで数分かかる場合があります。

注:ffmpegimagemagick(すなわちlibassし、それに応じてfontconfigで)いくつかの特定のライブラリを使用してコンパイルする必要があります。


約> 40秒のクリップを処理しません:github.com/vvo/gifify/issues/99
オリゴフレン

19.04:もう1つの必要なパッケージがgifsicleですが、別の問題が発生します:github.com/vvo/gifify/issues/95また、npm初心者に実行するディレクトリとnpm installルートとして実行するかどうかを教えてもらえますか?ありがとう!
ニコラスラウル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.