#author("2022-01-30T17:34:48+09:00","default:Miyashita","Miyashita") #author("2023-12-06T02:59:02+09:00","default:Miyashita","Miyashita") *ffmpeg [#led7feb7] #contents [[ffmpeg Documentation>https://ffmpeg.org/ffmpeg.html]] の中から個人的に使用頻度の高いものをメモ. **静止画を繋げて動画作成 [#yb238ea4] 静止画を動画のそれぞれ1コマのとして利用するために,画像のファイル名が適切にナンバリングされている必要がある.~ 以下,~ snapshot_001.png~ snapshot_002.png~ ...~ のような画像ファイル( .svg 等でも同様)があるとする.~ ~ ***1秒あたり n 枚の画像を挿入して gif を作成 [#f7731f92] rオプションでフレームレートを指定する. #codeprettify{{ fps=10 # 10 frames per second ffmpeg -r $fps -i snapshot_%03d.png example.gif }} また,デフォルトでは 000 や 001 や等の0付近のファイルで,かつ全て連番になっていないと適切なフレーム作成ができないみたい.~ 上記の場合,連番になっている全ての画像ファイルが動画に使用される.~ ~ ~ ***画質を落としたくない [#r9f9ac81] #codeprettify{{ ffmpeg -r $fps -i snapshot_%03d.png -q:v 1 example.gif }} オプションの -q:v は -qscale:v と同じ??? :v はビデオのことを指し,-q:a とするとオーディオを指す.~ ここでは音は使わないため -q:a は関係なし. ~ ~ ***パレットの最適化 [#g327f5b5] 上記のように作成した gif の画質が変だったり不自然な線が掛かるときに,パレットの最適化をしたら修正できた.2段階必要. #codeprettify{{ ffmpeg -i snapshot_%03d.png -vf palettegen palette.png ffmpeg -r $fps -i snapshot_%03d.png -i palette.png -filter_complex paletteuse example.gif }} これと大体同じことを1行で済ませる方法もあるらしい. #codeprettify{{ ffmpeg -i snapshot_%03d.png -filter_complex "fps=$fps,scale=720:-1:flags=lanczos,split[a],palettegen,[a]paletteuse" example.gif ffmpeg -r $fps -i snapshot_%03d.png -filter_complex "scale=720:-1:flags=lanczos,split[a],palettegen,[a]paletteuse" example.gif }} scale オプションは出力の幅も指定する.scale=720:-1 の -1で,アスペクト比を維持し,縦の長さは自動で決定される. ~ ~ ***n 番目のファイルから動画を作成(n-1 番目までは無視) [#edc20775] #codeprettify{{ startnum=11 # 11から ffmpeg -r $fps -start_number $startnum -i snapshot_%03d.png example.gif }} この場合, snapshot_011.png から動画が作成される.snapshot_010.png などのファイルは無視される.~ ~ ~ ***n 番目のファイルから始まり, n+50 番目のファイルで終わる動画を作成 [#kf959454] #codeprettify{{ ffmpeg -r 10 -start_number n -i snapshot_%03d.png -vframes 50 example.gif }} vframes オプションは,-i の後に付けなければならない.~ n を 51 とすれば,snapshot_051.png から snapshot_100.png までを(フレームレートが10なので)5秒間におさめた動画になる.~ ~ ~ ***ファイルが連番でないとき [#he9e5ee5] snapshot_000.png, snapshot_005.png, snapshot_010.png のように順番に並んではいるけど,数字が 1 刻みでないとき. #codeprettify{{ ffmpeg -r 10 -i snapshot_%*.png example.gif }} というように %* とすれば動画作成可能. ~ ~ ***ログの出力量の変更 [#d5e40857] loglevel オプションを使うと,出力量を調整できる. #codeprettify{{ ffmpeg ....... -loglevel quiet }} quiet は何も出力せず,その他は少ない順に fatal, error, warning などがある.~ ~ ~ ***上書き [#bddf363f] 保存先に同じ名前のファイルがあるときは通常 y/n で確認の入力を求められるが,-y オプションをつけることで強制的に上書きされる. #codeprettify{{ ffmpeg -y ........................ }} ~ ~ ***メモ [#r60ee138] convert の gif 作成は eps でもできるが,ffmpeg は eps ではできない.~ convert で png などに変換して ffmpeg でアニメーションを作成することならできる.~ ~ ~ **動画から静止画を抽出 [#kcbf0b2b] 上記の逆で,動画から静止画を抽出することもできる.~ 1秒あたり 30 フレームの example.mp4 というファイルのコマを一つずつ切り出すことを考える, #codeprettify(lang-bash){{ # def file="example.mp4" # ファイル名 startsec=14 # 切り出しの開始時間(秒) duration=3 # 切り出す時間の長さ(秒),この場合, 14+3=17秒時点まで fps=30 # fps output="frame%05d.png" # filename output # ffmpeg # -i は -ss の後に ffmpeg -ss $startsec -t $duration -i $file -r $fps -f image2 -start_number 0 -q:v 1 $output }} 出力画像のファイル名は,上記のように "frame%05d.png" と指定すると,frame00000.png という名前になる.~ ~ 切り出し開始時間 ss オプションで時間を指定したあとに i オプションを置かないと ss の設定が反映されなかった.~ さらに,最初のフレーム(0.00秒時)が 00001.png になるとわかりにくいので "-start_number 0" をつけているが,これも先の方に置くと正常に動作しない.~ オプションの配置順が重要らしい.~ ~ ちなみにこのときの ffmpeg のバージョンは下記の通り. version 2.8.14-0ubuntu0.16.04.1 Copyright (c) 2000-2018 the FFmpeg developers ~ ~ **動画の連結 [#k1770a20] 例えば mp4 形式の動画を結合して1つの mp4 にしたいとき. #codeprettify{{ ffmpeg -safe 0 -f concat -i mp4files.txt -c:v copy -c:a copy -map 0:v -map 0:a output.mp4 }} mp4files.txt (ファイル名は任意)の中に,連結したい順番に 'file ファイル名' と記述する.下はその一例. file inputA.mp4 file inputB.mp4 file inputC.mp4 ~ ~ **動画のファイル形式変換(mp4 → mpg) [#d666cbde] DVD へ焼くための mp4 から mpg への変換でかなり手こずった.~ シンプルに #codeprettify{{ ffmpeg -i hoge.mp4 hoge.mpg }} でも可能だが,映像にも音声にもノイズが出てしまう.~ ~ このページを参考に解決した → [[ffmpegで1080iのMPEG2から480iのDVD-Videoを作る>http://hikaen2.hatenablog.com/entry/20150201/1422773879]]~ 元動画の映像・音声のビットレートをそれぞれ確認し,下記のようにすると劣化を抑えて変換できた. #codeprettify{{ ffmpeg -i hoge.mp4 -vf yadif=1,scale=1920:1080,tinterlace=4 -target ntsc-dvd -s 1920x1080 -q:v 1 -q:a 1 -b:v 8M -maxrate 9M -minrate 7M -bufsize 1M -b:a 192k hoge.mpg }} サイズを表す scale や 音声のビットレートを指定する -b:a などは元動画(.mp4)のプロパティを確認して入力する.~ それぞれのオプションが何を意味するかは調べれば出てくるが,動画によって maxrate 等の設定が異なるので,結局ある程度の試行錯誤は必要かも.~