ffmpeg
を使用して、数がゼロから始まらない一連のシーケンスからビデオを作成することは可能ですか?
たとえば、いくつかの画像[test_100.jpg、test_101.jpg、test_102.jpg、...、test_200.jpg]があり、それらをビデオに変換したいと思います。私は次のコマンドを試してみましたが、うまくいきませんでした(数字はゼロから始まるはずです)。
ffmpeg -i test_%d.jpg -vcodec mpeg4 test.avi
何かアドバイスはありますか?
以下のように-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シェルでは、-i Imgp%04d.jpg
を-i "Imgp%%04d.jpg"
に置き換えます。これは、Mike Fitzpatrick https://superuser.com/a/344178/153054 によるものです)
以下のコードスニペットを使用できます。
cat *.jpg | ffmpeg -f image2pipe -r 1 -vcodec mjpeg -i - -vcodec libx264 out.mp4
スクリプトの例は ffmpegのドキュメント にあります。
3.2 1枚の写真をムービーにエンコードするにはどうすればよいですか?
名前を変更する写真が多数ある場合は、次のコマンドを使用して負担を軽減できます。このコマンドは、bourneシェル構文を使用して、* jpgに一致する現在のディレクトリ内のすべてのファイルを
/tmp' directory in the sequence of
img001.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
ffmpegはbashスタイルのグロビングもサポートします(*は任意の数の任意の文字を表します)。
これは、画像が連続していても前の例のように必ずしも番号順になっていない場合に便利です。
ffmpeg -r 1 -pattern_type glob -i 'test_*.jpg' -c:v libx264 out.mp4
そのため、ファイルがソートされている限り、-pattern_type glob
スイッチを使用するとうまくいきます。
私の知る限りでは、乱数でシーケンスを開始することはできません(0と1のどちらで開始するべきかを覚えていません)。画像の追加をやめます。
また、私の答えに対するコメントで述べたように、あなたはあなたのインデックスの幅を指定する必要があることを忘れないでください。好きです:
image%03d.jpg
また、%03dインデックスタイプを使用している場合は、次のようにファイル名を0で埋め込む必要があります。
image001.jpg image002.jpg image003.jpg
等.
私はFranciscoに同意しますが、回避策として、ffmpegが必要とするシーケンス番号を持つファイルへのシンボリックリンクを移動または作成するための簡単なスクリプトを書くことができます。その後、スクリプトはffmpegを呼び出してからリンクを削除するか、ファイルを元の場所に戻すことができます。
私はこれが古い質問であることを知っています、しかし私は同じ答えを探している間私はそれをグーグルで見つけました。ここの答えのどれも完全に私を満足させなかった従って私はより多くの捜索と読書をしました、そしてこれは私が私自身の問題のために思い付いたコマンドです。
cat {0032..1501}*.png | ffmpeg -f image2pipe -framerate 5 -i - -s 720x480 test2.avi
このようなコマンドを使用する理由は次のとおりです。
見上げる
x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i"
/tmp/img"$counter".jpg; x=$(($x+1)); done
のドキュメント から、単純に*を使うことができるようです。
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番目のフィルタから渡します)
私のビデオがフラッシュプレーヤーに入っていたので私はflvエンコーダを使いました(Jwplayer)
ffmpeg -i%d.jpg -vcodec flv test.flv
これを convert -morph
で行うことができます。
convert *.jpg -delay 10 -morph 10 %05d.jpg
あなたがffmpeg
を使いたいのなら、私は使いました
ffmpeg -pattern_type glob -i '*.jpg' -vf "setpts=10*PTS" movie.mp4
10*PTS
はffmpegに10倍遅くするように伝えます。あなたはそれをスピードアップするためにそこに分数を持つこともできます。
-pattern_type glob
オーディオを使用した具体例
https://superuser.com/a/782520/128124 でこのオプションについて言及しましたが、出力ビデオに音声を追加するなど、使用方法の具体例をいくつか示します。
毎秒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
これは次のようなものです。
オーディオを追加します。
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
YouTubeアップロード用に、1つの音楽ファイルを固定画像付きの動画に変換します
回答: 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
特殊なアルゴリズムを使用してフレーム間で圧縮できるため、ビデオがZipよりも画像シーケンスをどれだけ圧縮するかを観察するのはクールです。
opengl-rotating-triangle.mp4
:340Kopengl-rotating-triangle.Zip
:730万CLIオプションについて
ただし、-glob
という名前にもかかわらず、これはシェルグローブパターンほど一般的ではないことに注意してください。例:-i '*'
は失敗します。 https://trac.ffmpeg.org/ticket/362 =(明らかにファイルタイプは拡張子から推定されるため)。
-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 したがって、各フレームを30回繰り返して、1秒間に1枚の効果を維持します。
次のステップ
次のことも必要になります。
動画の長さに合わせて音声をカットします: https://stackoverflow.com/questions/18444194/cutting-the-videos-based-on-start-and-end-time-using-ffmpeg
ffmpeg -i in.mp3 -ss 03:10 -to 03:30 -c copy out.mp3
カットアップオーディオを追加します。 ffmpegでオーディオファイルとビデオファイルをマージする方法
ffmpeg -i video.mp4 -i audio.mp3 -c copy output.mkv
TODO:コマンドラインから複数のオーディオファイルをカットしてビデオに連結する方法を学習します。
テスト済み
ffmpeg 3.4.4、vlc 3.0.3、Ubuntu 18.04。
書誌
私の場合は、ファイル内の数字のために、少しトリッキーでした。これが私の画像がどのように見えるかです:
$ 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