ffmpeg メモ

ffmpeg Documentation の中から個人的に使用頻度の高いものをメモ.

静止画を繋げて動画作成

静止画を動画のそれぞれ1コマのとして利用するために,画像のファイル名が適切にナンバリングされている必要がある.

以下,
snapshot_001.png
snapshot_002.png
...
のような画像ファイルがあるとする.(または.png)

  • 1秒あたり10枚の画像を挿入してgif動画を作成
    rオプションでフレームレートを指定する.
    fps=10 # 10 frames per second
    ffmpeg -r $fps -i snapshot_%03d.png movie_sample.gif
    また,デフォルトでは 000 や 001 や等の0付近のファイルで,かつ全て連番になっていないと適切なフレーム作成ができないみたい.
    上記の場合,連番になっている全ての画像ファイルが動画に使用される.


  • 画質を落としたくない
    ffmpeg -r $fps -i snapshot_%03d.png -q:v 1 movie_sample.gif
    オプションの -q:v は -qscale:v と同じ??? :v はビデオのことを指し,-q:a とするとオーディオを指す.
    ここでは音は使わないため -q:a は関係なし.

  • パレットの最適化
    上記のように作成した gif の画質が変だったり不自然な線が掛かるときに,パレットの最適化をしたら修正できた.2段階必要.
    ffmpeg -i snapshot_%03d.png -vf palettegen palette.png
    ffmpeg -r $fps -i snapshot_%03d.png -i palette.png -filter_complex paletteuse movie_sample.gif


  • n番目のファイルから動画を作成(n-1 番目までは無視)
    startnum=11 # 11から
    ffmpeg -r $fps -start_number $startnum -i snapshot_%03d.png movie_sample.gif
    この場合, snapshot_011.png から動画が作成される.snapshot_010.png などのファイルは無視される.


  • n番目のファイルから始まり, n+50番目のファイルで終わる動画を作成
    ffmpeg -r 10 -start_number n -i snapshot_%03d.png -vframes 50 movie_sample.gif
    vframes オプションは,-i の後に付けなければならない.
    n を 51 とすれば,snapshot_051.png から snapshot_100.png までを5秒間におさめた動画になる.


  • ログ出力のテキストを抑える loglevel オプションを使うと,出力量を調整できる.
    ffmpeg ....... -loglevel quiet
    quiet は何も出力せず,その他は少ない順に fatal, error, warning などがある.


  • 上書き 保存先に同じ名前のファイルがあるときは,通常 y/n のインプットを求められるが,-y オプションをつけることで強制的に上書きされる.
    ffmpeg -y ........................


メモ

convert の gif 作成は eps でもできるが,ffmpeg は eps ではできない.
convert で png などに変換して ffmpeg でアニメーションを作成することならできる.


動画から静止画を抽出

上記の逆で,動画から静止画を抽出することもできる.
1秒あたり 30 フレームの example.mp4 というファイルのコマを一つずつ切り出すことを考える,

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



動画の連結

例えば mp4 形式の動画を結合して1つの mp4 にしたいとき.

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)

DVD へ焼くために mp4 から mpg への変換する時にかなり手こずった.
シンプルに

ffmpeg -i hoge.mp4 hoge.mpg

でも可能だが,映像にも音声にもノイズが出てしまう.

このページを参考に解決した → ffmpegで1080iのMPEG2から480iのDVD-Videoを作る
元動画の映像・音声のビットレートをそれぞれ確認し,下記のようにすると劣化を抑えて変換できた.

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 等の設定が異なるので,結局ある程度の試行錯誤は必要かも.


Front page   Edit Diff Attach Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2020-03-29 (Sun) 04:09:07 (6d)