2010-05-13 17:58:09 +0000 2010-05-13 17:58:09 +0000
89
89

FFmpegを使って画像から動画を作るには?

ffmpegを使って、数字が0から始まらないシーケンスからビデオを作ることは可能でしょうか?

例えば、私はいくつかの画像 [test_100.jpg, test_101.jpg, test_102.jpg, … test_200.jpg] を持っていて、それらを動画に変換したいのですが、以下のコマンドを試してみましたが、うまくいきませんでした。以下のコマンドを試してみたが、うまくいかなかった(数字は0から始まるはずなので):

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

Any advise?

回答 (10)

84
84
84
2012-08-28 13:19:14 +0000

このように -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 は静止画のシーケンスの開始点です。隙間があり、すべての静止画を含めたい場合は、隙間を埋めるためにナンバリングを変更する必要があるかもしれません。_

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

私は以下のワンライナーを使用して、フレームレートを遅くし、画像を圧縮して結果の動画を小さくしています。

0x1&

-s オプションは、結果として得られるビデオのフレームレートを毎秒3フレームに設定し、それぞれの静止画を短時間で見ることができるようにします。-i Imgp%04d.jpg オプションは、結果として得られるビデオのサイズを管理するために、画像を希望の解像度に再スケーリングします。

(Windowsシェルでは-i "Imgp%%04d.jpg"を0x6&に置き換えてください。これについては Mike Fitzpatrick https://superuser.com/a/344178/153054 に謝意を表します。)

17
17
17
2010-07-18 17:02:21 +0000

スクリプトの例は ffmpeg documentation に掲載されています。

*3.2 シングルピクチャをムービーにエンコードするには? *

リネームしたいピクチャが大量にある場合は、以下のコマンドを使うと負担が軽減されます。ボーンシェルの構文を使ったこのコマンドは、カレントディレクトリ内の「*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
``` 0x1&
14
14
14
2014-07-13 07:11:20 +0000

ffmpeg のドキュメントより: ](https://trac.ffmpeg.org/wiki/Create%20a%20video%20slideshow%20from%20images)

Using a glob pattern

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

これは、画像が連続しているが、前の例のように必ずしも数値的に連続しているわけではない場合に便利です。

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

つまり、ファイルがソートされている限り、-pattern_type glob スイッチを使用しても問題ありません。

11
11
11
2010-05-13 18:15:35 +0000

私が知っている限りでは、乱数でシーケンスを開始することはできません(0か1で開始すべきかどうかは覚えていません)。また、ギャップを設けることもできません。

また、私の回答へのコメントにあるように、インデックスの幅を指定する必要があることを覚えておいてください。例えば、以下のように。

image%03d.jpg

また、%03d インデックスタイプを使用する場合は、ファイル名を 0 で埋める必要があります。

image001.jpg image002.jpg image003.jpg

など。

5
5
5
2010-05-13 18:23:37 +0000

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

2
2
2
2016-08-03 23:44:55 +0000

これは古い質問ですが、同じ答えを探しているときにGoogleで見つけました。ここでの答えはどれも私を完全に満足させるものではなかったので、さらに検索して読んでみたところ、これは私が自分の問題のために思いついたコマンドです。

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

このようなコマンドを使う理由は以下の通りです。

0x1&

  1. 例えば、ブラケット展開のような bash の機能や grep のような他のコマンドを使用して、結果を微調整することができます。
  2. 覚えておくべきスイッチの数が減りました。
  3. r を使わず、代わりに -framerate を使うことをお勧めします。私の経験では、-r はより頻繁にフレームを落とす傾向があります。
  4. 複雑さが少なく、不必要なスイッチを使用しないので、そのままで動作します。もっと複雑なものを追加して(例えばエンコーダを指定するなど)、必要に応じて微調整することもできます。
0
0
0
2019-08-22 09:59:39 +0000

-pattern_type glob 音声付きの具体例

このオプションは で紹介されていますが、ここでは出力映像に音声を追加するなどの具体的な使用例を紹介します。 https://superuser.com/a/782520/128124 で紹介しましたが、ここでは出力映像に音声を追加するなど、具体的な使用例をいくつか紹介します。

1秒間に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 patent-unencumbered video format .

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

といった具合です。

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

などのようにソートしてください。 http://unix.stackexchange.com/questions/68770/converting-png-frames-to-video-at-1-fps/339399#339399

30 FPSで1フレームに1枚の画像を使用した通常のスピードビデオ

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -i audio.ogg -c:a copy -shortest -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

音声を追加します。

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://www.youtube.com/watch?v=HG7c7lldhM4 ](https://superuser.com/questions/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572)

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

回答済み。回答先: MP3をYoutube対応の動画形式に変換する方法

合成テスト入力画像をいくつか入手する

この回答で使用しているテスト画像です。

0x1&

で生成された画像。

0x1&

生成された画像: 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: 7.3M

CLI オプションについて

ただし、-glob という名前にもかかわらず、シェルの Glob パターのように一般的なものではないことに注意してください。-i '*' は失敗します。 https://trac.ffmpeg.org/ticket/3620 (どうやらファイルタイプが拡張子から推測されるため)。

-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 そのため、1秒間に1枚の画像を表示する効果を維持するために、各フレームを30回繰り返します。

次のステップ

また、次のことも行います。

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

Tested on

ffmpeg 3.4.4.4, vlc 3.0.3, Ubuntu 18.04.

参考文献

0
0
0
2017-10-30 18:28:51 +0000

私の場合は、ファイルの中に数字が入っているので少し厄介でした。私の画像は以下のようになっています。

$ 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
``` 0x1&
0
0
0
2016-01-29 12:05:41 +0000

ドキュメント](https://ffmpeg.org/ffmpeg.html)からは、単純に「\*

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

0x1&

」とすればいいようですが、品質に影響を与えるためには、レート/fpsが重要になるかもしれません(例えば、最初に非常に低い/高いフレームレートを指定して、スローモーションビデオを正常にする第2のフィルタから渡す?

0
0
0
2016-01-14 23:22:34 +0000

これは convert -morph でできます。

convert *.jpg -delay 10 -morph 10 %05d.jpg
ffmpeg -pattern_type glob -i '*.jpg' -vf "setpts=10*PTS" movie.mp4

ffmpegを使いたい場合は、10*PTSはffmpegに10回速度を落とすように指示します。また、端数を指定して速度を上げることもできます。

関連する質問

6
10
5
37
3