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
ベストアンサー1
-pattern_type glob
この優れたオプションにより、多くの場合、画像の選択が容易になります。
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
: 340Kopengl-rotating-triangle.zip
: 730万
1つの音楽ファイルを固定画像付きの動画に変換し、YouTubeにアップロードします
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 つのデモがあります:
ヒッピーになってOGGコンテナ内の特許に縛られないビデオフォーマット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.ogv
当然ながら、画像はアルファベット順に並べる必要があります。通常は次のようにします。
0001-first-thing.jpg
0002-second-thing.jpg
0003-and-third.jpg
等々。
また、まずは使用するすべての画像が同じアスペクト比になるように、トリミングしたりimagemagick
、ノマック事前に、ffmpeg が難しい判断をしなくて済むようにする必要があります。特に、幅は 2 で割り切れる必要があります。そうでない場合は、「幅が 2 で割り切れません」というエラーで変換が失敗します。
完全なリアルなスライドショーのケーススタディのセットアップ手順
スライドショーを作成するには、ffmpegコマンドを1つ実行するだけでは不十分なので、ここではより興味深い詳細な例を示します。このタイムラインに触発されて。
入力メディアを取得します。
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.
# https://unix.stackexchange.com/questions/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 を取得し、他のすべての画像をその正確なサイズに変換して、アスペクト比を崩します。
次に、画像を480pのアスペクト比に自動的に変換します。ImageMagick: 画像を特定のアスペクト比に最小限にトリミングするにはどうすればよいですか?
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
mogrify -path black -thumbnail 640x480 -background black -gravity center -extent 640x480 png/*.png
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
これはシェルの Glob パターンほど一般的ではないことに注意してください。例:-i '*'
失敗:https://trac.ffmpeg.org/ticket/3620(どうやらファイルタイプは拡張子から推測されるようです)。
-r 30
-framerate 1
低フレームレートの VLC などのプレーヤーのバグを克服するために、ビデオを 30 FPS にします。ffmpeg で画像から作成された 1 FPS の低速ビデオで VLC がフリーズするしたがって、1 秒あたり 1 画像という望ましい効果を維持するために、各フレームを 30 回繰り返します。
次のステップ
また、次のことも必要です:
オーディオを結合する前に、必要な部分を切り取ります。ffmpeg を使用して開始時間と終了時間に基づいてビデオをカットする
ffmpeg -i in.mp3 -ss 03:10 -to 03:30 -c copy out.mp3
-ss
あるいは、オーディオの直前にを追加して、変換コマンドで直接カットすることもできます-i
。ffmpeg -framerate 1 -pattern_type glob -i 'raw/*.png' -ss 0:36 -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p raw.mp4
TODO: 中間ファイルなしで複数のオーディオ ファイルをカットしてビデオに連結する方法を学習します。おそらく可能だと思います。
- ffmpeg のカットと連結の単一コマンドライン
- https://video.stackexchange.com/questions/21315/concatenating-split-media-files-using-concat-protocol
- https://superuser.com/questions/587511/concatenate-multiple-wav-files-using-single-command-without-extra-file
画像ごとに異なる持続時間
https://video.stackexchange.com/questions/23530/use-ffmpeg-to-create-a-video-from-a-few-images解決策を提供します。
次のようなファイルを作成しますin.txt
:
file png/1.png
outpoint 5
file png/2.png
outpoint 2
file png/3.png
outpoint 7
outpoint
前の画像の継続時間を秒単位で設定します。
次に、-framerate
前の変換コマンドを削除します。
ffmpeg -f concat -i in.txt -framerate 1 -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p black.mp4
また、ファイル内のファイル名を使用するアプローチは、入力ファイルの名前を変更して正しい順序にするよりも優れている点も気に入っています。これにより、テキスト エディターで画像をすばやく並べ替えることが容易になります (複数では機能しませんでした)。入力ファイルごとに 2 行あると少し面倒になります。 and を1 行に-i
まとめることはできませんでしたが、それでも知っておいてよかったです。file
outpoint
この方法は、画像のサブセットのみを変換する場合にも便利です。その後、ImageMagick での時間を節約するために、そのin.txt
ファイルを再利用して、必要な画像のみをループ処理することができます。
grep -E '^file ' in.txt | sed -E 's/^file //; s/\..*//' | while read f; do
echo $f
convert -thumbnail 1280x720 -background black -gravity center -extent 1280x720 "$(command ls -1 ../$f.* | grep -v .xcf | head -n1)" "out/$f.jpg"
done
テスト済み
ffmpeg 3.4.4、vlc 3.0.3、Ubuntu 18.04。
文献