FFmpeg で画像からビデオを作成するには? [closed] 質問する

FFmpeg で画像からビデオを作成するには? [closed] 質問する
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: 340K
  • opengl-rotating-triangle.zip: 730万

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

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

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: 中間ファイルなしで複数のオーディオ ファイルをカットしてビデオに連結する方法を学習します。おそらく可能だと思います。

画像ごとに異なる持続時間

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まとめることはできませんでしたが、それでも知っておいてよかったです。fileoutpoint

この方法は、画像のサブセットのみを変換する場合にも便利です。その後、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。

文献

おすすめ記事