web-dev-qa-db-ja.com

FFmpegを使用して画像からビデオを作成する方法

ffmpegを使用して、数がゼロから始まらない一連のシーケンスからビデオを作成することは可能ですか?

たとえば、いくつかの画像[test_100.jpg、test_101.jpg、test_102.jpg、...、test_200.jpg]があり、それらをビデオに変換したいと思います。私は次のコマンドを試してみましたが、うまくいきませんでした(数字はゼロから始まるはずです)。

ffmpeg -i test_%d.jpg -vcodec mpeg4 test.avi

何かアドバイスはありますか?

86
vailen

以下のように-start_numberスイッチを使用すれば、ファイルの名前を変更する必要はありません。

ffmpeg -start_number n -i test_%d.jpg -vcodec mpeg4 test.avi

nは一連の静止画の始まりです。

注意してください、これはシーケンスが始まったら中断されない限り有効です。ギャップがあり、すべての静止画を含めたい場合は、ギャップを埋めるために番号を付け直す必要があるかもしれません。

他にも便利なスイッチがいくつかあります。

以下のワンライナーを使用して、フレームレートを遅くし、画像を圧縮してビデオを小さくしています。

ffmpeg.exe -f image2 -framerate 25 -pattern_type sequence -start_number 1234 -r 3 -i Imgp%04d.jpg -s 720x480 test.avi

-r 3オプションは、結果として得られるビデオのフレームレートを毎秒3フレームに設定するので、それぞれを短時間で静止画を見ることができます。 -sオプションは、結果のビデオのサイズを管理するために、写真を希望の解像度に拡大縮小します。

(Windowsシェルでは、-i Imgp%04d.jpg-i "Imgp%%04d.jpg"に置き換えます。これは、Mike Fitzpatrick https://superuser.com/a/344178/153054 によるものです)

78
Assad Ebrahim

以下のコードスニペットを使用できます。

 cat *.jpg | ffmpeg -f image2pipe -r 1 -vcodec mjpeg -i - -vcodec libx264 out.mp4
38
kuanghaibin

スクリプトの例は ffmpegのドキュメント にあります。

3.2 1枚の写真をムービーにエンコードするにはどうすればよいですか?

名前を変更する写真が多数ある場合は、次のコマンドを使用して負担を軽減できます。このコマンドは、bourneシェル構文を使用して、* jpgに一致する現在のディレクトリ内のすべてのファイルを/tmp' directory in the sequence ofimg001.jpg、 `img002.jpg 'などにシンボリックリンクします。

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done

次に実行します。

ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
17
gaizka

ffmpegのドキュメントから:

グロブパターンを使う

ffmpegはbashスタイルのグロビングもサポートします(*は任意の数の任意の文字を表します)。

これは、画像が連続していても前の例のように必ずしも番号順になっていない場合に便利です。

ffmpeg -r 1 -pattern_type glob -i 'test_*.jpg' -c:v libx264 out.mp4

そのため、ファイルがソートされている限り、-pattern_type globスイッチを使用するとうまくいきます。

12
Nevin Williams

私の知る限りでは、乱数でシーケンスを開始することはできません(0と1のどちらで開始するべきかを覚えていません)。画像の追加をやめます。

また、私の答えに対するコメントで述べたように、あなたはあなたのインデックスの幅を指定する必要があることを忘れないでください。好きです:

image%03d.jpg

また、%03dインデックスタイプを使用している場合は、次のようにファイル名を0で埋め込む必要があります。

image001.jpg image002.jpg image003.jpg

等.

11
Francisco Soto

私はFranciscoに同意しますが、回避策として、ffmpegが必要とするシーケンス番号を持つファイルへのシンボリックリンクを移動または作成するための簡単なスクリプトを書くことができます。その後、スクリプトはffmpegを呼び出してからリンクを削除するか、ファイルを元の場所に戻すことができます。

5
Jason B

私はこれが古い質問であることを知っています、しかし私は同じ答えを探している間私はそれをグーグルで見つけました。ここの答えのどれも完全に私を満足させなかった従って私はより多くの捜索と読書をしました、そしてこれは私が私自身の問題のために思い付いたコマンドです。

cat {0032..1501}*.png | ffmpeg -f image2pipe -framerate 5 -i - -s 720x480 test2.avi

このようなコマンドを使用する理由は次のとおりです。

  1. Catおよび-f image2pipeを使用すると、使用する画像を細かく制御できます。たとえば、ブラケット展開などのbash機能やgrepなどの他のコマンドを使用して、必要に応じて結果を微調整できます。
  2. 覚えておくスイッチが少なくなります。
  3. -rを使用しないことをお勧めします。代わりに-framerateを使用してください。私の経験では、-rはより頻繁にフレームを落とす傾向があります。
  4. それほど複雑ではなく、不要なスイッチが使用されていないため、そのまま機能します。あなたはあなたのニーズに合うようにもっと複雑なもの(例えばエンコーダの指定)と微調整を加えるかもしれません。
1
David Bobb

見上げる

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i"
/tmp/img"$counter".jpg; x=$(($x+1)); done
1
owcc

のドキュメント から、単純に*を使うことができるようです。

For example, for creating a video from filenames matching the glob pattern foo-*.jpeg:

ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi

注意として、品質への影響を改善するためには、レート/ fpsが重要になるかもしれません(例えば、最初に非常に低い/高いフレームレートを指定し、次にスローモーションビデオを通常にする2番目のフィルタから渡します)

0
ntg

私のビデオがフラッシュプレーヤーに入っていたので私はflvエンコーダを使いました(Jwplayer)

ffmpeg -i%d.jpg -vcodec flv test.flv

0
nick phillips

これを convert -morph で行うことができます。

convert *.jpg -delay 10 -morph 10 %05d.jpg

あなたがffmpegを使いたいのなら、私は使いました

ffmpeg -pattern_type glob -i '*.jpg' -vf "setpts=10*PTS" movie.mp4

10*PTSはffmpegに10倍遅くするように伝えます。あなたはそれをスピードアップするためにそこに分数を持つこともできます。

0
Martin Thoma

-pattern_type globオーディオを使用した具体例

https://superuser.com/a/782520/128124 でこのオプションについて言及しましたが、出力ビデオに音声を追加するなど、使用方法の具体例をいくつか示します。

毎秒1つの画像を含むスライドショービデオ

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
  -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

それにいくつかの音楽を追加し、画像が終わるときに音声をカットオフします:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

YouTubeの2つのデモは次のとおりです。

ヒッピーになって Theoraの特許権を持たないビデオ形式 :を使用してください

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libtheora -r 30 -pix_fmt yuv420p out.ogg

もちろん、画像はアルファベット順にソートする必要があります。通常は次のとおりです。

0001-first-thing.jpg
0002-second-thing.jpg
0003-and-third.jpg

等々。

参照: http://unix.stackexchange.com/questions/68770/converting-png-frames-to-video-at-1-fps/339399#339399

30 FPSでフレームごとに1つの画像を含む通常速度のビデオ

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -c:v libx264 -pix_fmt yuv420p out.mp4

これは次のようなものです。

生成されるGIF: https://askubuntu.com/questions/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574

オーディオを追加します。

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -i audio.ogg -c:a copy -shortest -c:v libx264 -pix_fmt yuv420p out.mp4

結果: https://www.youtube.com/watch?v=HG7c7lldhM4

YouTubeアップロード用に、1つの音楽ファイルを固定画像付きの動画に変換します

回答: MP3をYouTubeで許可されたビデオ形式に変換する方法?

いくつかの合成テスト入力画像を取得します

これらは私がこの回答で使用しているテスト画像です。

wget -O opengl-rotating-triangle.Zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.Zip
cd opengl-rotating-triangle
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg

生成される画像: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292

特殊なアルゴリズムを使用してフレーム間で圧縮できるため、ビデオがZipよりも画像シーケンスをどれだけ圧縮するかを観察するのはクールです。

  • opengl-rotating-triangle.mp4:340K
  • opengl-rotating-triangle.Zip:730万

CLIオプションについて

ただし、-globという名前にもかかわらず、これはシェルグローブパターンほど一般的ではないことに注意してください。例:-i '*'は失敗します。 https://trac.ffmpeg.org/ticket/362 =(明らかにファイルタイプは拡張子から推定されるため)。

-r 30は、低フレームレートのVLCなどのプレーヤーのバグを克服するために-framerate 1ビデオ30 FPSを作成します。 https://stackoverflow.com/questions/19267443/playback-issues-in-vlc- with-low-fps-video-from-images-using-ffmpeg/41797724#41797724 したがって、各フレームを30回繰り返して、1秒間に1枚の効果を維持します。

次のステップ

次のことも必要になります。

TODO:コマンドラインから複数のオーディオファイルをカットしてビデオに連結する方法を学習します。

テスト済み

ffmpeg 3.4.4、vlc 3.0.3、Ubuntu 18.04。

書誌

私の場合は、ファイル内の数字のために、少しトリッキーでした。これが私の画像がどのように見えるかです:

$ ls | head -5
2014_aq_unprocessed 001.jpg
2014_aq_unprocessed 002.jpg
2014_aq_unprocessed 003.jpg
2014_aq_unprocessed 004.jpg
2014_aq_unprocessed 005.jpg

これが私が使ったコマンドです。

ffmpeg -i 2014_aq_unprocessed\ %3d.jpg  -vcodec mpeg4 test.avi
0
Mona Jalal