FFmpegで画像からビデオを作成する方法?


163
ffmpeg -r 1/5 -start_number 2 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

この行は問題なく動作しましたが、別のフォルダーの画像からビデオファイルを作成したいと考えています。私のフォルダ内の画像名は次のとおりです。

img001.jpg
img002.jpg
img003.jpg
...

別のフォルダから画像ファイルを入力するにはどうすればよいですか?例:C:\mypics

このコマンドを試してみましたがffmpeg、最初の画像(img001.jpg)のみのビデオを生成しました。

ffmpeg -r 1/5 -start_number 0 -i C:\myimages\img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

回答:


167

画像からビデオスライドショーを作成する– FFmpegをご覧ください

ビデオがフレームを正しく表示しない場合最初の画像がスキップされる、または1つのフレームのみが表示されるなどの問題が発生した場合は、出力フレームレートに-rの代わりにfpsビデオフィルターを使用してください。

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4

または、フォーマットビデオフィルターをフィルターチェーンに追加して、-pix_fmt yuv420p"fps = 25、format = yuv420p"のように置き換えることができます。この方法の利点は、どのフィルターが最初になるかを制御できることです

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" out.mp4

以下のパラメータをテストしましたが、うまくいきました

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -vf "fps=25,format=yuv420p" e:\out.mp4

以下のパラメータも機能しましたが、常に最初の画像をスキップします

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -r 30 -pix_fmt yuv420p e:\out.mp4

異なるフォルダに配置された画像からビデオを作成する

まず、以下のように画像パスをimagepaths.txtに追加します。

# this is a comment details https://trac.ffmpeg.org/wiki/Concatenate

file 'E:\images\png\images__%3d.jpg'
file 'E:\images\jpg\images__%3d.jpg'

以下の使用例。

"h:\ffmpeg\ffmpeg.exe" -y -r 1/5 -f concat -safe 0 -i "E:\images\imagepaths.txt" -c:v libx264 -vf "fps=25,format=yuv420p" "e:\out.mp4"

-safe 0パラメーターは、安全でないファイル名エラーを防止します

関連リンク

FFmpegは、異なるフォルダーに配置された画像からビデオを作成します

FFMPEG中間ガイド/画像シーケンス

連結– FFmpeg


「ビデオがフレームを正しく表示しない場合最初の画像がスキップされる、または1つのフレームだけが表示されるなどの問題が発生した場合は、代わりにfpsビデオフィルターを使用してください申し訳ありませんが、「fpsビデオフィルター」
arnuschky 2014年

3
私の知る限り、–rパラメータは可変フレームレートです。これは、FFMPEGがフレームをドロップまたは複製して、目的の出力フレームレートを達成する可能性があることを意味します。fpsフィルター「-vf fps = value」を使用すると、FFMPEGは一定のフレームレートを生成します。画像からビデオスライドショー作成する– FFmpegを参照してください。これは-rとfpsフィルターの(技術的な)違いは何ですか?。使用して-r時々パラメータをクーゼ最初の画像をスキップ...
カーン

このリストの最初のコマンドは機能しているffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4ように見えましたが、最終的にはビデオがどのプレイヤー(Ubuntu)からも読めない結果になりました。VNCは「moovアトムが見つからない」と述べました。これを修正しようとするとqt-faststart、「ファイルの最後のアトムはmoovアトムではありませんでした」というエラーが発生します
sh37211

147

-pattern_type glob

この優れたオプションにより、多くの場合、イメージを選択しやすくなります。

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

等々。

また、使用するすべての画像が同じアスペクト比であることを最初に確認します。おそらく、事前にimagemagickまたはnomacsでトリミングして、ffmpegが難しい決定をする必要がないようにします。特に、幅は2で割り切れる必要があります。そうでない場合、変換は「2で割り切れない幅」で失敗します。

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

これらは私が使用したテストメディアです:

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

で生成された画像:GLUT / OpenGLを使用してファイルにレンダリングする方法

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

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

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

回答済み:https : //superuser.com/questions/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572

ステップバイステップの完全なスライドショーのケーススタディ設定

スライドショーの作成には、単一のffmpegコマンドを実行するよりも少し多いので、このタイムラインに触発されたより興味深い詳細な例示します

入力メディアを取得します。

mkdir -p orig
cd orig
wget -O 1.png https://upload.wikimedia.org/wikipedia/commons/2/22/Australopithecus_afarensis.png
wget -O 2.jpg https://upload.wikimedia.org/wikipedia/commons/6/61/Homo_habilis-2.JPG
wget -O 3.jpg https://upload.wikimedia.org/wikipedia/commons/c/cb/Homo_erectus_new.JPG
wget -O 4.png https://upload.wikimedia.org/wikipedia/commons/1/1f/Homo_heidelbergensis_-_forensic_facial_reconstruction-crop.png
wget -O 5.jpg https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Sabaa_Nissan_Militiaman.jpg/450px-Sabaa_Nissan_Militiaman.jpg
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg
cd ..

# Convert all to PNG for consistency.
# /unix/29869/converting-multiple-image-files-from-jpeg-to-pdf-format
# Hardlink the ones that are already PNG.
mkdir -p png
mogrify -format png -path png orig/*.jpg
ln -P orig/*.png png

これで、最終的なアスペクト比を決定するためにすべての画像サイズを簡単に確認できます。

identify png/*

出力:

png/1.png PNG 557x495 557x495+0+0 8-bit sRGB 653KB 0.000u 0:00.000
png/2.png PNG 664x800 664x800+0+0 8-bit sRGB 853KB 0.000u 0:00.000
png/3.png PNG 544x680 544x680+0+0 8-bit sRGB 442KB 0.000u 0:00.000
png/4.png PNG 207x238 207x238+0+0 8-bit sRGB 76.8KB 0.000u 0:00.000
png/5.png PNG 450x600 450x600+0+0 8-bit sRGB 627KB 0.000u 0:00.000

そのため、クラシックな480p(640x480 == 4/3)のアスペクト比が適切と思われます。

最小のサイズ変更で1つの変換を実行して幅を均等にします(TODOは任意の幅で自動化されます。ここでは、identify出力を手動で見て、幅と高さを1つ減らしました)。

mkdir -p raw
convert png/1.png -resize 556x494 raw/1.png
ln -P png/2.png png/3.png png/4.png png/5.png raw
ffmpeg -framerate 1 -pattern_type glob -i 'raw/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p raw.mp4

次のように表示されるため、これはひどい出力を生成します。

ffprobe raw.mp4

ffmpegは最初の画像のサイズ556x494を取得し、他のすべての画像をその正確なサイズに変換して、縦横比を壊します。

次に、ImageMagickに従ってトリミングすることにより、画像をターゲットの480pアスペクト比に自動的に変換します。画像を特定のアスペクト比に最小限にトリミングする方法は?

mkdir -p auto
mogrify -path auto -geometry 640x480^ -gravity center -crop 640x480+0+0 png/*.png
ffmpeg -framerate 1 -pattern_type glob -i 'auto/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p auto.mp4

これでアスペクト比は良好になりましたが、必然的に一部のトリミングが必要になり、画像の興味深い部分が切り取られました。

もう1つのオプションは、次の図に示すのと同じアスペクト比になるように黒の背景を埋め込むことです。ボックスに合わせてサイズを変更し、「空の」部分の背景を黒に設定します。

mkdir -p black
ffmpeg -framerate 1 -pattern_type glob -i 'black/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p black.mp4

ただし、一般的に言えば、最初からこれらの問題を回避するために、同じまたは同様のアスペクト比の画像を選択できることが理想的です。

CLIオプションについて

名前にもかかわらず、ことに注意してください-glob例えば、これはシェルグロブpattersとして一般的なようではありません:-i '*'失敗:https://trac.ffmpeg.org/ticket/3620(どうやらファイルタイプは拡張子から推定されているため)。

-r 30作る-framerate 1:ビデオ30 FPSが低いフレームレートのためのVLCのような選手にバグを克服するためにVLCはffmpegの持つイメージから作成された低1 FPSビデオにフリーズするためには、第二の効果につき1枚の画像を希望維持するために、各フレームを30回繰り返します。

次のステップ

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

TODO:中間ファイルなしで複数のオーディオファイルをカットしてビデオに連結する方法を学びます。それが可能であると確信しています。

テスト済み

ffmpeg 3.4.4、vlc 3.0.3、Ubuntu 18.04。

参考文献


pythonとsubprocess.callを使用してffmpegを開始する場合は'、入力ファイル名と出力ファイル名に単一引用符を使用しないでください。そうしないと、ファイルが見つかりません。
RunOrVeith

これは私にとっては素晴らしいことですが、npmパッケージからのビルドはffmpeg-staticglobを実装していません。(Pattern type 'glob' was selected but globbing is not supported by this libavformat build
セビ

-pix_fmtTrailing options were found on the commandline.エラーの原因
Anthony Kong

@AnthonyKong ffmpeg -framerate 1 -pattern_type glob -i '*.png' -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4Ubuntun 19.10 ffmpeg 4.1.4 では再現できませんでした。バージョンと正確なコマンドは何ですか?
Ciro Santilli郝海东冠状病六四事件法轮功

20

ドキュメントのシンプルなバージョン

Google Earth Studio画像に特に適しています

ffmpeg -framerate 24 -i Project%03d.png Project.mp4

1
この出力を再生できません:[h264 @ 0x7f148cc3cc40]ハードウェアアクセラレータが画像をデコードできませんでした
Bram

こんにちは私はどのようにそのコマンドを実行できますか?
罪のない

ターミナルまたはコンソールから@Innocent。
Joshua Pinter

それは人間だが、プロジェクト%の3d.pngは名前Project001.png、Project002.pngでフォルダ内の私のすべての画像を選んでいなかったので、それだけに私はすべての私の写真を取得し、ビデオに変換するために何をすべきか2枚の画像を取得します
イノセント

を使用しています%3d%03d
Joshua Pinter

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