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


86

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

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

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

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


あなたがこれを尋ねてからしばらく経ちましたが、質問にまだ興味があるなら、答えはYESです-詳細と例を以下に投稿しました:stackoverflow.com/a/12160155/181638
Assad Ebrahim

@casperOneは、なぜこれが話題から外れているのかを知るのに役立ちます。特定のプログラミングの問題のようです。FFmpegのタグは3.7Kフォロワーを持ち、そして27Kビューを明確に人々はそれが便利...
geotheory

2
@geotheoryタグの統計は無関係です。ffmpegは、WinRarのような意味でのプログラムです。ffmpegライブラリをプログラムすることはできますが、この質問はそれに関するものではありません。コマンドラインからffmpegを使用することは、スーパーユーザーに尋ねられ、トピックの場所です。
casperOne

回答:


81

次の-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シェルで、これをMike Fitzpatrick https://superuser.com/a/344178/153054に置き換え-i Imgp%04d.jpgください。-i "Imgp%%04d.jpg"


4
-rと-framerateの違いは何ですか?

1
それらは同じIIRC
rogerdpack

22
(たとえば) 'ls'に表示される順序を受け入れて満足している限り、ナンセンスにナンバリングする必要はありません... ffmpeg -pattern_type glob -i '* .jpg' movie.mp4
Orwellophile

2
画像間の時間ギャップを制御するスイッチはありますか?たとえば、最初の画像を表示したいのですが、13秒、2番目の15秒、24秒、3番目の時間のギャップはユーザー定義です、それは可能ですか?
zionpi


38

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

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

これは、メタデータで指定された回転にJPGを回転しません。
エリックヨハンソン

17

ffmpegのドキュメントでサンプルスクリプトを見つけることができます。

3.2単一の画像をムービーにエンコードするにはどうすればよいですか?

名前を変更する画像が多数ある場合は、次のコマンドを使用して負担を軽減できます。このコマンドは、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

2
ffmpegが期待するとおり、画像名の開始img000.jpgが開始されるように、x = 0を開始する方が良いでしょう。また、ffmpegがファイルを見つけられなかったため、シンボリックリンクが機能しなかったため、代わりにcpを使用する必要がありました(明らかな速度とスペースの引き戻しですが、とにかくそれらをrmします)。mvは、オリジナルを失うことを気にしない場合にも機能します。

この回答では、提供されたコマンドがシンボリックリンクではなくハードリンクを作成することに注意してください。cpリンクが機能しない場合の使用に関して、ファイルシステムがリンクをサポートしていれば、cp --reflink=autoはるかに優れた速度/スペースの使用が実現します。
フェリックスサパレリ

12

ffmpegのドキュメントから

globパターンを使用する

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

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

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

そのため、ファイルが並べ替えられている限り、-pattern_type globスイッチを使用しても問題はありません。


このglobは通常のシェルglob:trac.ffmpeg.org/ticket/3620よりも制限されていることに注意してください。これは明らかに、イメージタイプが拡張から推測されるためです。
Ciro Santilli新疆改造中心法轮功六四事件

11

私が知る限り、あなたは乱数でシーケンスを開始することはできません(0または1で開始する必要があるかどうか覚えていません)、さらに、ギャップがあることはできません。画像の追加を停止します。

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

image%03d.jpg

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

image001.jpg image002.jpg image003.jpg


1
画像ファイル名の先頭にゼロがある場合、フォーマット文字列は「%03d」などの幅も指定する必要があります。

1
それが唯一の障害である場合は、適切に再インデックス化されたセットに画像の名前を変更するか、シンボリックリンクするスクリプトを書くことができます。
カスカベル

1
はい、私は以前にこれで作業しましたが、しばらく前にinstance.addImage()、instance.processVideo()を呼び出すRubyでラッパーを作成し、一時ディレクトリを作成し、適切なインデックスで画像をコピー/名前変更しましたそしてビデオを作成します。とても簡単です。

@Jefromiシンボリックリンクを作成しましたが、シンボリックリンクファイルのパスをffmpegに渡すにはどうすればよいですか?それは単にシンボリックリンクファイルが私が変換しようとしている画像であると仮定していますか?私はwin7 btwにいます

シーケンスは、0から4までのどこからでも開始できます。
アサドエブラヒム

5

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


1

調べる

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

1

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

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. それほど複雑ではなく、不必要なスイッチは使用されておらず、そのまま機能します。複雑さ(エンコーダの指定など)を追加し、ニーズに合わせて微調整できます。

OPの質問については、-start_number必要なのはそれだけです。
ギャン

0

私のビデオはフラッシュプレーヤー(Jwplayer)で使用されていたため、flvエンコーダーを使用しました

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


0

ドキュメントから、単に使用できるようです*

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

私の場合、ファイル内の数字のため、少し複雑でした。画像は次のようになります。

$ 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

これを行うにはconvert -morph

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

使用したい場合ffmpeg、私は使用しました

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

ここでは、10*PTSffmpegに10倍遅くするように指示しています。また、速度を上げるために小数を使用することもできます。


これは、元の画像シーケンスを新しいスペースに補間するだけで、OPが要求したようなビデオファイルは作成されません。
f0ster

0

-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の特許を取得していないビデオ形式を使用します

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

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

回答: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例えば、これはシェルのグロブpattersほど一般的ではありません:-i '*'失敗:https://trac.ffmpeg.org/ticket/3620(どうやらファイルタイプは拡張子から推定されているため)。

-r 30-framerate 1低フレームレートのVLCなどのプレーヤーのバグを克服するために、ビデオを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。

書誌

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.