Quantcast
Channel: FFmpeg | ニコラボ
Viewing all 310 articles
Browse latest View live

フィルタで手軽にリミッテッドレンジに出来る limiter

$
0
0

ffmpeg 3.4 から追加予定のフィルタ。各チャンネルの上限と下限を越えたらその上限と下限でカットする limiter フィルタの使い方。今までは lut フィルタでも同様のことが出来たが、こちらのフィルタの方がコードの量も少なく直感的でわかりやすい。

基本コマンド

すべてのチャンネルを 16 から 235 までのリミテッドレンジに変える
ffmpeg -i input -vf limiter=16:235 output
ffplay -i input -vf limiter=16:235

オプション

  • min[int]
    最小値の指定
    範囲:0 から 65535 まで
    既定値:0
  • max[int]
    最大値の指定
    範囲:0 から 65535 まで
    既定値:65535
  • planes[int]
    フィルタを当てるチャンネル指定
    詳しくは ffmpeg について | チャンネルの順番と注意点 を参照
    範囲:0 から 15 まで
    既定値:15(すべてのチャンネル)

フリッカー(ちらつき) を低減する deflicker

$
0
0

ffmpeg 3.4 から追加予定のフィルタ。蛍光灯や昔の映像で数フレーム毎に明るくなったり暗くなったりするのを前後フレームから平均してちらつきを抑える deflicker フィルタの使い方。

基本コマンド

5フレーム前から輝度の平均が始まる
ffmpeg -i input -vf deflicker=s=5:m=0:bypass=0 output
ffplay -i input -vf deflicker=5:0:0

オプション

size の値を大きくすると輝度ブラーの効果になる。

  • size, s[int]
    何フレーム前を対象に平均するか
    範囲:2 から 129 まで
    既定値:5
  • mode, m[int] 平均するアルゴリズムの指定
    • am, 0
      Arithmetic mean, 算術平均
      既定値
    • gm, 1
      Geometric mean, 幾何平均
    • hm, 2
      Harmonic mean, 調和平均
    • qm, 3
      Quadratic mean, 平方平均
    • cm, 4
      Cubic mean
    • pm, 5
      Power mean
    • median, 6
      中央値
  • bypass[boolean]
    Do not actually modify frame. Useful when one only wants metadata.
    使い方がよく分からない
    既定値:0

矩形部分の YUV, RGB の値を表示する pixscope

$
0
0

ffmpeg 3.4 から追加予定のフィルタ。矩形部分の YUV, RGB の平均値と最小値、最大値、RMS と矩形の拡大も表示される pixscope フィルタの使い方。

基本コマンド

映像中央の縦横7ピクセルを調べて、統計データを右下に表示する
ffmpeg -i input -vf pixscope=x=0.5:y=0.5:w=7:h=7:o=0.5:wx=-1:wy=-1 output
ffmpeg -i input -vf pixscope=0.5:0.5:7:7:0.5:-1:-1 output
ffplay -i input -vf pixscope=0.5:0.5:7:7:0.5:-1:-1

pixscope フィルタの表示例

公式ドキュメント:FFmpeg Filters Documentation : pixscope

オプション

入力した映像の解像度は 640×484 以上を指定する

  • x[float]
    調べる座標の横座標の相対位置
    既定値:0.5
    範囲:0 から 1 まで
  • y[float]
    調べる座標の縦座標の相対位置
    既定値:0.5
    範囲:0 から 1 まで
  • w[int]
    調べる座標の横解像度
    既定値:7
    範囲:1 から 80 まで
  • h[int]
    調べる座標の縦解像度
    既定値:7
    範囲:1 から 80 まで
  • o[float]
    平均と最小値、最大値、RMS を表示する部分の透過具合
    既定値:0.5
    範囲:0(透明) から 1 まで
  • wx[float]
    データ表示場所の横座標の相対位置
    既定値:-1
    数値はマイナスになってもプラスになっても絶対値が同じなら同じ結果になる
    範囲:-1 から 1 まで
  • wy[float]
    データ表示場所の縦座標の相対位置
    既定値:-1
    数値はマイナスになってもプラスになっても絶対値が同じなら同じ結果になる
    範囲:-1 から 1 まで

直線上の YUV, RGB の値を表示する oscilloscope

$
0
0

ffmpeg 3.4 から追加予定のフィルタ。直線上の YUV, RGB の平均値と最小値、最大値と波形が表示される oscilloscope フィルタの使い方。

基本コマンド

中央の平行方向で調べるコマンド例
ffmpeg -i input -vf oscilloscope=x=0.5:y=0.5:s=0.8:t=0.5:o=0.8:tx=0.5:ty=0.9:tw=0.8:th=0.3:c=7:g=1:st=1:sc=1 output
ffmpeg -i input -vf oscilloscope=0.5:0.5:0.8:0.5:0.8:0.5:0.9:0.8:0.3:7:1:1:1 output
ffplay -i input -vf oscilloscope=0.5:0.5:0.8:0.5:0.8:0.5:0.9:0.8:0.3:7:1:1:1

oscilloscope の表示例

16:9 の映像で調べる範囲と統計グラフの幅を 0.9 で揃えるコマンド例
ffplay "-i input -vf oscilloscope=s='0.9*16/hypot(9,16)':tw=0.9

オプション

  • x[float]
    調べる範囲の横の中央位置
    既定値:0.5
    範囲:0 から 1 まで
  • y[float]
    調べる範囲の縦の中央位置
    既定値:0.5
    範囲:0 から 1 まで
  • s[float]
    調べる映像の対角線に対して相対的な長さ
    t=0.5:tw=ns=’n*横解像度比/hypot(縦解像度比,横解像度比)’ の併用で統計グラフと調べる座標の位置が一致する
    既定値:0.8
    範囲:0 から 1 まで
  • t[float]
    調べる範囲の角度。0.5 で水平になり、小さくなれば反時計回りに傾き、大きくなれば時計回りに傾く。0 にすると下が左になり上が右になる。1 にすると下が右になり上が左になる
    既定値:0.5
    範囲:0 から 1 まで
  • o[float]
    統計グラフの透過具合
    既定値:0.8
    範囲:0(透明) から 1 まで
  • tx[float]
    統計グラフの表示場所の横の中央位置
    既定値:0.5
    範囲:0 から 1 まで
  • ty[float]
    統計グラフの表示場所の縦の中央位置
    既定値:0.9
    範囲:0 から 1 まで
  • tw[float]
    統計グラフの横幅
    既定値:0.8
    範囲:0.1 から 1 まで
  • th[float]
    統計グラフの縦幅
    既定値:0.3
    範囲:0.1 から 1 まで
  • c[int]
    統計グラフで表示するチャンネル指定
    詳しくは ffmpeg について | チャンネルの順番と注意点 を参照
    既定値:7
    範囲:0 から 15 まで
  • g[boolean]
    統計グラフの枠線表示
    既定値:1
  • st[boolean]
    統計値の表示
    既定値:1
  • sc[boolean]
    調べる範囲を示す線を表示
    既定値:1

ffmpeg 3.4 リリース

$
0
0

2017年10月16日、ffmpeg 3.4 Cantor(カントル)がリリースされた。3.4 は 3.3 からのメジャーアップデートでこれまでに取り込まれたコミットのすべてが入っている。

前回更新記事:ffmpeg 3.3 リリース

git.ffmpeg.org Git – ffmpeg.git/blob – RELEASE_NOTES
git.videolan.org Git – ffmpeg.git/blob – Changelog

追加されたフィルタで記事にしているフィルタ一覧

フィルタ以外の注目点
update cuvid/nvenc headers to Video Codec SDK 8.0.14 と、書いてないが libxml2 対応により MPEG-DASH の xml が読み込めるようになっている。ちなみに MPEG-DASH は youtube-dl でも読み込める。

関連記事
ffmpeg に nvenc(cuda) をインストールする

新しい映像の品質評価 vmafmotion

$
0
0

Netflix が使っている複数の解像度にエンコードされた動画の品質評価に使われている VMAF(Video Multimethod Assessment Fusion) のモーションスコアの計算が ffmpeg で使えるようになった。

vmaf モーションスコアを計算するフィルタは2つあり、この vmafmotion./configure --enable-libvmaf でライブラリをインストールして使える libvmaf フィルタがある。前者は1つの映像の vmaf モーションスコアを計算し、後者は2つの映像を比較した vmaf モーションスコアを計算する。これらのフィルタは異なる解像度でも品質評価ができ ssim, psnr フィルタよりも見た目の評価に近しいものを目指している。数値が 0 になると前フレームからの変化が無いことを示す。

2つの映像の画質評価をする SSIM

使い方は先に元動画の vmaf モーションスコアを計算し、次にエンコードした動画の vmaf モーションスコアを計算し何割減ったかを調べる。

Netflix/vmaf: Perceptual video quality assessment based on multi-method fusion.
Toward A Practical Perceptual Video Quality Metric – Netflix TechBlog – Medium

基本コマンド

vmaf モーションスコアを計算しエンコードが終わると平均 vmaf モーションスコアをコンソールに表示する
ffmpeg -i input -vf vmafmotion -an -f null -
さらにフレーム毎の vmaf モーションスコアを log.txt のテキストファイルで出力する
ffmpeg -i input -vf vmafmotion=log.txt -an -f null -

公式ドキュメント:FFmpeg Filters Documentation : vmafmotion

オプション

stats_file[string]
すべてのフレームの平均 vmaf モーションスコアを表示したログファイルを指定したパスに出力する
既定値:無指定(何も出力しない)

ffmpeg で MPEG-DASH を扱う

$
0
0

MP4Box は使わずに ffmpeg だけで MPEG-DASH の MPDファイルを作る方法。また ffmpeg 3.4 からは libxml2 を有効にすることで MPDファイルを読み込むことも出来る。

関連記事
ffmpeg で Apple HTTP Live Streaming(HLS)を扱う

基本コマンド

すべてのセグメントを MPD に記載してコピーする
ffmpeg -i input -c copy -window_size 0 output.mpd
1つの映像に1つ目はオリジナルをコピーし、2つめは 640×360 にリサイズして2つのストリームでリアルタイム -re で出力する。-map 0 を2度使うことで2出力にしている
ffmpeg -re -i input -map 0 -map 0 -c:a copy -c:v:0 copy -b:v:1 600k -s:v:1 640x360 -profile:v:1 main -window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a" output.mpd

公式ドキュメント:FFmpeg Filters Documentation : dash(Muxers)

オプション

  • adaptation_sets[string]
    セグメント毎にどのデータを納めるか。streams に 0 から始まる整数を入れるとチャンネルマップに記載されたデータが納まる。v なら映像のすべて、a なら音声のすべてが納まる。映像と音声は別id で納める
    例:id=0,streams=0,1,2 id=1,streams=3,4
    例:id=0,streams=v id=1,streams=a
  • window_size[int]
    マニフェストに記載されるセグメント数。0 はすべて
    範囲:0 から INT_MAX まで
    既定値:0
  • extra_window_size[int]
    マニフェストに記載されなかったセグメントをどれだけ削除せずに残すか
    範囲:0 から INT_MAX まで
    既定値:5
  • min_seg_duration[int]
    セグメントの最小時間(マイクロ秒)
    範囲:0 から INT_MAX まで。5000000 で5秒
    既定値:5e+006(5000000)
  • remove_at_exit[boolean]
    エンコードが終わったらすべてのセグメントを削除する
    既定値:0
  • use_template[boolean]
    Enable (1) or disable (0) use of SegmentTemplate instead of SegmentList.
    既定値:1
  • use_timeline[boolean]
    Enable (1) or disable (0) use of SegmentTimeline in SegmentTemplate.
    既定値:1
  • single_file[boolean]
    セグメントではなく1つのファイルで出力する
    既定値:0
  • single_file_name[string]
    DASH-templated name to be used for baseURL. Implies storing all segments in one file, accessed using byte ranges
  • init_seg_name[string]
    イニシャルファイルのファイル名の指定
    既定値:init-stream$RepresentationID$.m4s
    ファイル名は init-stream0.m4s のようになる
  • media_seg_name[string]
    セグメントファイルのファイル名の指定
    既定値:chunk-stream$RepresentationID$-$Number%05d$.m4s
    ファイル名は chunk-stream0-00001.m4s のようになる
  • utc_timing_url[string]
    ISO 規格の UTC タイムスタンプを UTCTiming schemeIdUri に記入する。無記入だと指定されない
  • http_user_agent[string]
    HTTP ヘッダの User-Agent フィールドを優先させる
    既定値:なし
  • hls_playlist[boolean]
    .mpd ファイル作成と同時に VERSION:6 の HLS用のマスターマニフェスト(master.m3u8)、各ストリームのマニフェスト(media_%d.m3u8)を同時に出力する
    既定値:0

再生確認

Dash-Industry-Forum/dash.js を使うことで手軽に再生確認が出来る。

<!DOCTYPE html>
<html>
  <head>
    <script src="https://cdn.dashjs.org/latest/dash.all.min.js"></script>
    <title>MPEG DASH TEST</title>
    <style>
    video {
       width: 640px;
       height: 360px;
    }
</style>
  </head>
  <body>
    <div>
      <video data-dashjs-player autoplay src="output.mpd" controls></video>
    </div>
  </body>
</html>

1フレームに複数のフレームを表示する tile

$
0
0

一つの映像の前後フレームを1フレームに表示し確認できる tile フィルタの使い方。

3×3 のタイルの出力例

基本コマンド

3×3 のタイルで3秒間連番画像を出力する
ffmpeg -i input -vf tile=layout=3x3:nb_frames=0:margin=0:padding=0:color=black:overlap=0:init_padding=0 -t 3 output-%03d.jpg
キーフレームだけ出力する場合には入力ファイルの前に -skip_frame nokey をつける
ffmpeg -skip_frame nokey -i input -vf tile=3x3 -t 3 output-%03d.jpg
ノンリニア編集のように過去5つ前までのキーフレームを横に表示する
ffplay -skip_frame nokey -i input -vf tile=5x1:overlap=4,scale=1920:-1
ノンリニア編集のように過去5つ前までのフレームを横に表示する
ffplay -i input -vf tile=5x1:overlap=4,scale=1920:-1

関連記事
【ffmpeg】動画から特定フレームを画像で出力する方法
ニコ生のTSから一定時間毎に画像を出力する
ニコ生のTSからサムネイルを出力する

公式ドキュメント:FFmpeg Filters Documentation : tile

オプション

  • layout
    1フレームのタイルの枚数を指定する
    既定値:6×5(横x縦)
  • nb_frames
    1フレームにレンダリングするタイル数を指定する
    既定値:0(すべて)
    範囲:0 から INT_MAX (layout で指定したタイル以下)まで
  • margin
    上下左右に color で指定した色の枠を指定ピクセル分追加する
    既定値:0
  • padding
    タイルの間に color で指定した色の枠を指定ピクセル分追加する
    既定値:0
  • color
    margin, padding で追加した余白の色を指定する
    既定値:black(000000 形式も可能)
  • overlap
    フレームに表示される最後のタイルが次のフレームの最初のタイルと重なる枚数の指定
    既定値:0
    範囲:0 から INT_MAX(layout で指定したタイル数未満) まで
  • init_padding
    最初のタイルに空フレーム(真っ暗映像)を挿入する枚数の指定
    既定値:0
    範囲:0 から INT_MAX(総フレーム数 – 1) まで

複数の映像を任意の割合でミックスする mix

$
0
0

ffmpeg 3.5 から追加予定のフィルタ。複数の映像を任意の割合でミックスする mix フィルタの使い方。今までは透過チャンネルを使って overlay フィルタを使っていたがこれからはもっと手軽に複数の映像を映し出すことが出来る。

似たフィルタに fade フィルタがある
フェードイン、フェードアウトの設定ができる fade

基本コマンド

既定値では2入力である
ffmpeg -i input1 -i input2 -filter_complex mix ouput
ffmpeg -re -i input1 -i input2 -filter_complex mix -f sdl -

testsrc2 の映像

smptebars の映像

testsrc2, smptebars を mix した映像

3入力する場合のコマンド例
ffmpeg -i input1 -i input2 -i input3 -filter_complex mix=3 ouput
公式ドキュメント:FFmpeg Filters Documentation : mix

オプション

入力する映像は同じ解像度にすること。

  • nb_inputs[int]
    入力数の指定
    既定値:2
    範囲:2 から INT_MAX まで
  • weights[string]
    入力の比重指定。入力数毎にスペースを空ける
    既定値:”1 1″
  • duration[int] : フィルタの終了方法
    • longest, 0 : 一番長い映像が終わったら。既定値
    • shortestt, 1 : 一番短い映像が終わったら
    • first, 2 : 1入力の映像が終わったら

上下左右を特定色で埋める fillborders

$
0
0

解像度を変えずに上下左右を特定色で埋める fillborders フィルタの使い方。上下左右にロゴや不要な映像が入っているときに真っ黒にしたり、4:3解像度の映像を16:9にするときに pad フィルタを使って左右に余白を追加し、その余白を合わせ鏡のように変えることも出来る。

基本コマンド

左右100ピクセルを隣接した色で埋める
ffmpeg -i input -vf fillborders=left=100:right=100 output
ffplay -i input -vf fillborders=100:100

上下100ピクセルを白枠に変える
ffmpeg -i input -vf fillborders=top=100:bottom=100:mode=fixed:color=white output
ffplay -i input -vf fillborders=0:0:100:100:2:white

smptebars に fillborders フィルタでライムグリーンをつけた例

公式ドキュメント:FFmpeg Filters Documentation : fillborders

オプション

  • left[int]
    左のピクセル数の指定
    既定値:0
    範囲:0 から INT_MAX(横解像度まで) まで
  • right[int]
    右のピクセル数の指定
    既定値:0
    範囲:0 から INT_MAX(横解像度まで) まで
  • top[int]
    上のピクセル数の指定
    既定値:0
    範囲:0 から INT_MAX(縦解像度まで) まで
  • bottom[int]
    下のピクセル数の指定
    既定値:0
    範囲:0 から INT_MAX(縦解像度まで) まで
  • mode[int] 上で指定したピクセルの埋め方
    • smear,0 : 隣接する色で埋める。既定値
    • mirror,1 : 合わせ鏡にする
    • fixed,2 : color の指定色
  • color[color]
    埋め合わせる色を指定する
    既定値:black(000000)

RGB を伸張させる normalize

$
0
0

指定色でのモノトーンを作ったり、レンジを広げて見栄えをよくするnormalize フィルタの使い方。

基本コマンド

フルダイナミックレンジに伸張し、平準化はしない、フリッカー(ちらつき)は映像によっては発生する
ffmpeg -i input -vf normalize=blackpt=black:whitept=white:smoothing=0:independence=1:strength=1
ffplay -i input -vf normalize=blackpt=black:whitept=white:smoothing=0:independence=1:strength=1

上と同じだが、50フレーム平準化する
ffmpeg -i input -vf normalize=blackpt=black:whitept=white:smoothing=50:independence=1:strength=1
上と同じだが、色相を保持する
ffmpeg -i input -vf normalize=blackpt=black:whitept=white:smoothing=50:independence=0:strength=1
上と同じだが、強度を半分にする
ffmpeg -i input -vf normalize=blackpt=black:whitept=white:smoothing=50:independence=0:strength=0.5
オリジナルと上の4つのコマンドを左上から160×720crop して左から順番に並べる
ffplay -i input -vf crop=160:720:0:0,split=5[1][2][3][4],normalize=blackpt=black:whitept=white:smoothing=0:independence=1:strength=1[1a];[2]normalize=blackpt=black:whitept=white:smoothing=50:independence=1:strength=1[2b];[3]normalize=blackpt=black:whitept=white:smoothing=50:independence=0:strength=1[3c];[4]normalize=blackpt=black:whitept=white:smoothing=50:independence=0:strength=0.5,[1][1a][2b][3c]hstack=5
明暗を反転させる
ffplay -i input -vf normalize=blackpt=white:whitept=black
暗いところは赤に、明るいところはシアンにマップする
ffplay -i input -vf normalize=blackpt=red:whitept=cyan

元映像

暗いところは赤に、明るいところはシアン

公式ドキュメント:FFmpeg Filters Documentation : normalize

オプション

  • blackpt[color]
    暗い色を指定した色にマップして出力する
    既定値:black(000000)
  • whitept[color]
    明るい色を指定した色にマップして出力する
    既定値:white(ffffff)
  • smoothing[int]
    前フレームを参照して平準化する
    既定値:0
    範囲:0 から 2.68435e+008 まで
  • independence[float]
    各チャンネルのカラーシフトをどれだけ独立させるか。色相を保持すると元の色から変化が少なくなる
    既定値:1
    範囲:0(色相保持) から 1(完全独立) まで
  • strength[float]
    強度の指定
    既定値:1
    範囲:0 から 1 まで

AMD VCE 対応の ffmpeg をつくる

$
0
0

ffmpeg 3.5 から追加予定のエンコーダ。AMF(Advanced Media Framework) SDK を使ったAMD の VCE(Video Coding Engine) を ffmpeg で使う方法。

関連記事
ffmpeg に nvenc(cuda) をインストールする
qsv 対応の ffmpeg をつくる

hardware acceleration の Wiki:HWAccelIntro – FFmpeg

準備

エンコード例

ffmpeg -i input -vcodec h264_amf -acodec copy output.mp4
ffmpeg -i input -vcodec hevc_amf -acodec copy output.mkv

h264_amf のオプション

公式ドキュメント PDF:AMF_Video_Encode_API
ffmpeg -h encoder=h264_amf

hevc_amf のオプション

公式ドキュメント PDF:AMF_Video_Encode_HEVC_API
ffmpeg -h encoder=hevc_amf

x264 一つのバイナリで複数のビット深度に対応

$
0
0

一つのバイナリで 8, 10 ビット深度の両方に対応した。それに伴って ffmpeg も両方エンコードが出来るようになった。ただし古い ffmpeg を利用するとエラーが出るので master を利用する。

対応コミット
git.videolan.org Git – x264.git/commitdiff : Unify 8-bit and 10-bit CLI and libraries
git.videolan.org Git – ffmpeg.git/commitdiff : x264: Support version 153

x264 のビルドにはオプション指定しなくても複数のビット深度に対応している。

ソースコード配布先
x264, the best H.264/AVC encoder – VideoLAN
git clone git://git.videolan.org/x264.git

x264 の出力方法はオプションに --output-dept 10 を追加する。追加しなければ 8bit深度になる。
ffmpeg の出力方法は yuv420p ならば出力オプションに -pix_fmt yuv420p10le を追加する。追加しなければ 8bit深度になる。

10bit HDR素材のエンコード例
ffmpeg -i input -vcodec libx264 -x264-params "range=tv:colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc" -acodec copy -pix_fmt yuv420p10le output.mp4

既定値のオプションの違いは qpmax が 8bit なら 69 なのが、10bit なら 81 になる。
x264 core 155 r2893 b00bcaf より
8bit
cabac=1 / ref=3 / deblock=1:0:0 / analyse=0x3:0x113 / me=hex / subme=7 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=6 / lookahead_threads=1 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=1 / b_bias=0 / direct=1 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=25 / scenecut=40 / intra_refresh=0 / rc_lookahead=40 / rc=crf / mbtree=1 / crf=23.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00
10bit
cabac=1 / ref=3 / deblock=1:0:0 / analyse=0x3:0x113 / me=hex / subme=7 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=6 / lookahead_threads=1 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=1 / b_bias=0 / direct=1 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=25 / scenecut=40 / intra_refresh=0 / rc_lookahead=40 / rc=crf / mbtree=1 / crf=23.0 / qcomp=0.60 / qpmin=0 / qpmax=81 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00

x264 と ffmpeg の libx264 との対応は以下を参照

ass の字幕ファイルを動画に焼き付ける ass

$
0
0

ass の字幕ファイルを動画に焼き付ける(ハードサブ) ass フィルタの使い方。似たフィルタに subtitles フィルタがあるが、ass フィルタは単純に ass ファイルを動画に焼き付けるだけの簡易なフィルタである。このフィルタを使うには –enable-libass が必要である。

基本コマンド

input.ass ファイルを表示する
ffmpeg -i input -vf ass=input.ass output
ffplay -i input -vf ass=input.ass

ass ファイルのパス指定の例。詳しくは パス指定とエスケープ を参照
ffmpeg -i input -vf ass='E\:/input.ass' output
ffplay -i input -vf ass='E\:/input.ass'

字幕ファイルのエンコードは –enable-libass がなくてもできる
ffmpeg -i input.srt output.ass

フォントの指定

字幕のフォント指定は ass の字幕ファイルを編集する
「MS UI Gothic」から「メイリオ ボールド」に変更

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,メイリオ ボールド,90,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,15,0,1,2,2,1,10,10,10,0
Style: Box,メイリオ ボールド,90,&HFFFFFFFF,&H000000FF,&H00FFFFFF,&H00FFFFFF,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,0
Style: Rubi,メイリオ ボールド,50,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,1,10,10,10,0
//

字幕ファイルを動画に焼き付ける subtitles

$
0
0

字幕ファイルを動画に焼き付ける(ハードサブ) subtitles フィルタの使い方。似たフィルタに ass フィルタがあるが、subtitles フィルタはass フィルタよりも複雑な設定ができる。このフィルタを使うには –enable-libasslibavcodec, libavformat が必要である。

ass の字幕ファイルを動画に焼き付ける ass

基本コマンド

input.ass ファイルを表示する
ffmpeg -i input -vf subtitles=input.ass output
ffplay -i input -vf subtitles=input.ass


公式ドキュメント:FFmpeg Filters Documentation : subtitles

オプション

  • filename, f[string]
    字幕ファイルの指定。必須項目
  • original_size[image_size]
    ASS 字幕が作成された動画の解像度を指定する。基本は無指定でよいが、アスペクト比が間違えて字幕ファイルに解像度が書き込まれたときに設定を書き換える
  • fontsdir[string]
    フォントディレクトリの指定
  • alpha[boolean]
    背景を透過して文字だけ表示させる
    既定値:0
  • charenc[string]
    文字コードをエンコードする。UTF-8 以外のときに有用
  • stream_index, si[int]
    複数の字幕ファイルが含まれる場合に何番目を読み込むかを指定
    既定値:-1(0 が1入力)
    範囲:-1 から INT_MAX まで
  • force_style[string]
    Styles の内容を強制する

alpha の使い方

alpha を使えば字幕以外がすべて透過するのでは無くて、予め映像自体を透過させておかないと字幕以外が透過しない。color ソースでのサンプル。開始6秒の時点で字幕が表示されていれば背景が透過して字幕が普通に表示される。
ffmpeg -ss 6 -f lavfi -i "color=color=white@0.0:size=800x600,format=rgba,subtitles=input.ass:alpha=1" -frames:v 1 output.png
普通の動画で映像を透過させるには映像をアルファチャンネル付きで読み込む必要があり、さらにアルファチャンネルの値を lutrgb フィルタで小さくするほど透過する。
ffmpeg -ss 6 -f lavfi -i "movie=input.mp4:sp=6,format=rgba,lutrgb=val:val:val:0,subtitles=input.ass:alpha=1" -frames:v 1 output.png

stream_index の使い方

複数の字幕が含まれるファイルを subtitles フィルタで読み込んだときにどれを表示するかを指定する。sub.mkv に含まれる1番目の字幕を表示する。2番目の字幕なら 1 を指定する。
ffmpeg -i input -vf "subtitles=sub.mkv:stream_index=0" output

force_style の使い方

具体的な指定の意味は ASS 仕組みと書き方 : geocities.co.jp/bancodesrt を参照。
指定例。KEY=VALUE で指定し、,(カンマ) でつなげる。Name 指定が出来ないので一括書き換えができない。
ffplay -i input -vf "subtitles=input.ass:'force_style=FontName=しねきゃぷしょん,Fontsize=64,OutlineColour=&H8000ff00,Outline=3,Shadow=3'"

  • FontName
  • Fontsize
  • PrimaryColour
    文字の色指定、ABGR の順番、H以降の8文字が該当する
    &HAABBGGRR の 00 から ff までが指定できる
    AA は 00 が不透明で、ff が完全に透明になる。半透明は 80
  • SecondaryColour
  • OutlineColour
  • BackColour
  • Bold
  • Italic
  • Underline
    下線
  • StrikeOut
    打ち消し線
  • ScaleX
  • ScaleY
  • Spacing
  • Angle
    文字の角度指定。90で縦書きになるが、縦書きフォントを使わないと単に縦表示になる
  • BorderStyle
    1:文字に沿って縁取る
    3:文字の周りを四角く縁取る
  • Outline
    縁取りの太さの指定
  • Shadow
    文字の右下に表示する影の太さの指定
  • Alignment
  • MarginL
  • MarginR
  • MarginV
  • Encoding

movie, amovie 入力の設定内容

$
0
0

ffplay で複数ファイルを読み込んだり、ffprobe でフィルタを当てた後のデータを調べるときに使う movie, amovie 入力の設定内容。名前の通り映像と音声なので字幕は読み込めない。

ffplay のショートカットキー

基本コマンド

映像だけ読み込む
ffplay -f lavfi -i movie=input.mp4
音声だけ読み込む
ffplay -f lavfi -i amovie=input.mp4
映像と音声を読み込む
ffplay -f lavfi -i movie=input.mp4[out0];amovie=input.mp4[out1]
ffplay -f lavfi -i movie=input.mp4:s=0+1[out0][out1]

開始20秒から読み込む
ffplay -f lavfi -i movie=input.mp4:sp=20,setpts=PTS-STARTPTS[out0];amovie=input.mp4:sp=20,asetpts=PTS-STARTPTS[out1]
ffplay -f lavfi -i movie=input.mp4:sp=20:s=0+1[out0][out1];[out0]setpts=PTS-STARTPTS[out0];[out1]asetpts=PTS-STARTPTS[out1]

10秒の映像を10回ループする
ffplay -f lavfi -i movie=input.mp4:loop=10:discontinuity=10
さらに音声も合わせる。streamsloop をサポートしてない
ffplay -f lavfi -i movie=input.mp4:loop=10:discontinuity=10[out0];amovie=input.mp4:loop=10:discontinuity=10[out1]
video4linux2 デバイスを読み込む
ffplay -f lavfi -i movie=/dev/video0:f=video4linux2,setpts=PTS-STARTPTS

公式ドキュメント:FFmpeg Filters Documentation : Multimedia Sources

オプション

  • filename
    入力ファイル名の指定。ただしファイルだけではなく特定のデバイスやプロトコルも読み込める
  • format_name, f
    入力ファイルのフォーマット指定。無指定なら入力ファイルのコンテナや入力デバイスから類推する
  • seek_point, sp
    シーク時間の指定。秒(ss)形式で指定する
  • streams, s
    入力ファイルのどのデータを読み込むかの指定。da なら最初映像、dv なら最初の音声。0 開始の数字はトラックの順番に指定。+ を付けて映像と音声や、音声二つ以上を読み込むことも出来る
  • stream_index, si
    streams に似ているが複数入力は出来ない。トラックの順番を 0 開始の数字で指定
  • loop
    ループ回数の指定。0 なら無限。1 なら1回になる。2回目以降のタイムスタンプを変更しないので discontinuity を指定するか、別途 setpts フィルタを使う
  • discontinuity
    loop を使うと2回目以降のタイムスタンプが変更されないので、1回目の終了時間秒(ss)を指定することで問題なくループできる

2色だけ、3色だけに減色する映像効果

$
0
0

2色のグラデーションにするには normalize フィルタを使えばよいが、2色だけ、3色だけにするには lutyuv, lutrgb フィルタを使いこなすことで作ることが出来る。イメージとしては「ブラタモリ」のオープニングで見られる効果に似ている。

RGB を伸張させる normalize

2色効果

YUV

Y 輝度信号(輝度) が125 以下は 16、126 以上は 235 に変換し、UV 彩度信号は128の白黒に変換する。
ffplay -i input -vf lutyuv='(between(val,126,255)*219)+16':128:128,format=gray

RGB

RGB が125 以下は 0、126 以上は 255 の白黒に変換する。
ffplay -i input -vf format=rgb24,colorchannelmixer=.3:.59:.11:0:.3:.59:.11:0:.3:.59:.11:0,lutrgb='between(val,126,255)*255:between(val,126,255)*255:between(val,126,255)*255',format=gray

2色効果

3色効果

YUV

Y 輝度信号(輝度) が120 以下は 16、121 以上 155 以下は 128、156 以上は 235 に変換し、UV 彩度信号は128の白グレー黒に変換する。
ffplay -i input -vf lutyuv='st(0,gt(val,120)+gt(val,155));eq(ld(0),0)*16+eq(ld(0),1)*128+eq(ld(0),2)*235':128:128,format=gray

RGB

RGB が121 以下は 0、122 以上 155 以下は 128、156 以上は 255 の白グレー黒に変換する。
ffplay -i input -vf format=rgb24,colorchannelmixer=.3:.59:.11:0:.3:.59:.11:0:.3:.59:.11:0,lutrgb='st(0,gt(val,120)+gt(val,155));eq(ld(0),0)*0+eq(ld(0),1)*128+eq(ld(0),2)*255':'st(0,gt(val,120)+gt(val,155));eq(ld(0),0)*0+eq(ld(0),1)*128+eq(ld(0),2)*255:''st(0,gt(val,120)+gt(val,155));eq(ld(0),0)*0+eq(ld(0),1)*128+eq(ld(0),2)*255',format=gray

3色効果

4色以上

palettegen, paletteuse フィルタを使う。白グレー黒の4色に変換する。
ffmpeg -i input -filter_complex format=gray,split[v],palettegen=4:0:lime:2[pal],[v][pal]paletteuse=0:0:1 -vframes 1 four_tone_colors.png

4色効果

使ったフィルタの解説

ffmpeg で複数出力

$
0
0

1つのファイルにフィルタを使い分けたり、コピーしたり複数出力する方法のまとめ。

普通のコマンド。1入力を2度エンコードを行い2出力する。つまり負荷も2倍。
ffmpeg -i input.mp4 -movflags +faststart -vcodec libx264 -acodec copy output1.mp4 -vcodec libvpx-vp9 -acodec libopus output2.webm

1入力で複数コピー出力するコマンド。
ffmpeg -i input.mp4 -movflags +faststart -c copy -movflags +faststart output1.mp4 -c copy output2.mp4
ffmpeg -i input.mp4 -movflags +faststart -c copy -f tee -map 0:v -map 0:a "output1.mp4|output2.mp4"


さらにフィルタを挟むことも可能。
ffmpeg -i input.mp4 -filter_complex scale=640x360 -movflags +faststart -f tee -map 0:v -map 0:a -vcodec libx264 -acodec copy "output1.mp4|output2.mp4"

出力先がローカルではなく配信先も可能。
ffmpeg -i input.mp4 -vsync passthrough -frame_drop_threshold 4 -map 0:v -map 0:a -flags +global_header -movflags +faststart -vcodec libx264 -acodec aac -f tee "[f=flv:onfail=ignore]rtmp://hogehoeg|[f=flv:onfail=ignore]rtmp://piyopiyo|D:\output.flv"

複数解像度で配信して動画も保存するコマンド。
ffmpeg -i input.mp4 -vsync passthrough -frame_drop_threshold 4 -filter_complex split[1],scale=1280x720[720p];[1]scale=1920x1080[1080p] -map [720p] -map 0:a -flags +global_header -vcodec libx264 -acodec aac -f tee "[f=flv:onfail=ignore]rtmp://hogehoge|D:\output-720p.flv" -map [1080p] -map 0:a -flags +global_header -vcodec libx264 -acodec aac -f tee "[f=flv:onfail=ignore]rtmp://piyopiyo|D:\output-1080p.flv"

一度に複数解像度にエンコードするコマンド。
ffmpeg -i input.mp4 -filter_complex split=3[0][1],scale=1920x1080[1080p];[0]scale=1280x720[720p];[1]scale=640x360[360p] -map [1080p] -map 0:a -movflags +faststart -vcodec libx264 -acodec aac output-1080p.mp4 -map [720p] -map 0:a -movflags +faststart -vcodec libx264 -acodec aac output-720p.mp4 -map [360p] -map 0:a -movflags +faststart -vcodec libx264 -acodec aac output-360p.mp4

ネットラジオなどリアルタイム配信している動画をコピー出力と1.5倍速出力を同時に行うコマンド。
ffmpeg -i "http://hogehoge" -c copy -bsf:a aac_adtstoasc output.mp4 -vf "setpts=2*PTS/3" -af "atempo=1.5" -vcodec libx264 -acodec aac output-x1.5.mp4

さらに VOD RTMP 配信の場合はバッファを増やさないと保存が遅くなる。
ffmpeg -rtmp_buffer 36000000 -i "rtmp://hogehoge" -c copy output.flv -vf "setpts=2*PTS/3" -af "atempo=1.5" -vcodec libx264 -acodec aac output-x1.5.flv

関連記事

TED の日本語字幕を保存し動画に合わせる

$
0
0

TED のプレゼンテーション動画をブラウザやアプリで見るときに字幕が選択できるが、これを ffmpeg で PC に保存し動画に合わせる方法。わざわざ字幕付き動画は公式から普通に保存できるが2言語の字幕付きの動画に変換する方法も併せて紹介する。

TED: Ideas worth spreading

動画の保存方法は PC からは再生ページのプレイヤ右下の「Share」から動画、音声、字幕を焼き付けた(ハードサブ)動画が選択できる。字幕の保存方法は簡単な方法はないが、まずブラウザでソースコードを表示して「ted://talks/」の次に書いてある数字を控えておき字幕用のアドレスに記入する。プレイヤに日本語字幕が選択できなければもちろん保存は出来ない。昔は動画リンクから字幕IDは調べられたが調べられなくなっている。

日本語字幕用のアドレス(1234 の部分に上で調べた数値を記入)。英語の場合は末尾が eng。
https://www.ted.com/talks/subtitles/id/1234/lang/jpn

そのほかの言語については以下を参照。
Get subtitle for TED video

字幕をブラウザから保存すると、json 形式になりこれでは動画プレイヤで扱えないので ffmpeg で変換する。

ffmpeg で字幕を扱いやすい .srt に変換し保存する。
ffmpeg -i https://www.ted.com/talks/subtitles/id/1234/lang/jpn output.srt

ネット越しではなくて PC に json を保存しても変換できる。
ffmpeg -i ted.json output.srt

公式ドキュメント:FFmpeg Formats Documentation : tedcaptions

複数字幕を同時に表示するには複数の字幕を1つに合わせる。方法として手動でコピペする方法と「cat」コマンドで連結する方法がある。この場合は元データの json ではなく字幕形式に予め変換しておく。以下のコマンド例は2つの字幕を1つにする。
cat jp.srt en.srt > jp-en.srt

動画に合わせるには映像と音声をコピーし、字幕もコピーする。字幕ファイルは .mkv の方が扱いやすい。
ffmpeg -i input.mp4 -i jp-en.srt -map 0 -map 1 -c copy -c:s copy output.mkv

.mp4 なら字幕コーデックを mov_text にする。ただしこれだと複数字幕を一つにしたときに字幕が複数段に表示されないので複数字幕の表示には非推奨。
ffmpeg -i input.mp4 -i jp-en.srt -map 0 -map 1 -c copy -c:s mov_text output.mp4

関連記事
ass の字幕ファイルを動画に焼き付ける ass
字幕ファイルを動画に焼き付ける subtitles
【ffmpeg】 マルチトラックの動画の作り方

自炊マンガの色補正

$
0
0

白くなるところが真っ白になってなかったり、黒になるところが真っ黒のになってないところを ffmpeg で補正する。方法はコントラストを上げて白はより白く、黒はより黒くする。今回は白黒ページの色補正だけでリサイズ(解像度を変える)、クロップ(指定範囲で切り取る)、デノイズは行わない。

自炊したときに .jpg(.png, .bmp でも可能) で出力したときに使える方法であり、.pdf は ffmpeg では扱えない。一般的に Photoshop や GIMP を使う方法がよく紹介されているが、これらは一度 RGB にデコードして再度 .jpg 出力するときに YUV に変換するので処理が遅くなりがちであるが、以下の方法は RGB 変換を挟まないので処理が早い。

基本コマンド

最近のマンガのコマンド例。真っ白と真っ黒以外に色が多い場合。
ffplay -i input -vf eq=contrast=1.5,lutyuv='st(0,gt(val,64)+gt(val,230));eq(ld(0),0)*0+eq(ld(0),1)*val+eq(ld(0),2)*255':128:128
ffmpeg -i input -vf eq=contrast=1.5,lutyuv='st(0,gt(val,64)+gt(val,230));eq(ld(0),0)*0+eq(ld(0),1)*val+eq(ld(0),2)*255':128:128,format=yuvj420p output.jpg

昔のマンガのコマンド例。白と黒だけ。他の色がある場合は色飛びする。
ffplay -i input -vf eq=contrast=2,lutyuv=val:128:128
ffmpeg -i input -vf eq=contrast=2,lutyuv=val:128:128,format=yuvj420p output.jpg

RGB画像(.png, .bmp)の場合。先に colorchannelmixer フィルタでグレーに色を変換する。
ffplay -i input -vf colorchannelmixer=.3:.59:.11:0:.3:.59:.11:0:.3:.59:.11:0,format=yuvj420p,eq=contrast=1.5,lutyuv='st(0,gt(val,64)+gt(val,230));eq(ld(0),0)*0+eq(ld(0),1)*val+eq(ld(0),2)*255':128:128
ffmpeg -i input -vf colorchannelmixer=.3:.59:.11:0:.3:.59:.11:0:.3:.59:.11:0,format=yuvj420p,eq=contrast=1.5,lutyuv='st(0,gt(val,64)+gt(val,230));eq(ld(0),0)*0+eq(ld(0),1)*val+eq(ld(0),2)*255':128:128 output.jpg

画像をD&Dするバッチファイル(ffmpeg のパス指定を各自書き換える)

画質設定

何も指定しなければ最適な品質指定で変換される。個別に指定する場合には -qscale:v [num] で 2 から 31 までの数値を指定する。小さい値ほど高画質・低圧縮・大容量で何も指定しなければ frame= 1 fps=0.0 q=17.2 Lsize=N/A time=00:00:00.04 bitrate=N/A speed=0.321x のようにコンソールに表示され、q=17.2 の部分が qscale:v で指定した値になる。
ffmpeg -i input -vf eq=contrast=1.5,lutyuv='st(0,gt(val,64)+gt(val,230));eq(ld(0),0)*0+eq(ld(0),1)*val+eq(ld(0),2)*255':128:128,format=yuvj420p -qscale:v 15 output.jpg

フィルタの解説

  • eq フィルタでコントラストを上げる、contrast=2 だと白黒だけになるので適宜調整する。
  • lutyuv フィルタの ‘st(0,gt(val,64)+gt(val,230));eq(ld(0),0)*0+eq(ld(0),1)*val+eq(ld(0),2)*255’:128:128 は Y 輝度信号が 64 以下は 0 にして、65 以上 230 以下はそのままの値にし、231 以上は 255 に変換する。後ろ2つの 128:128 は UV 青色と赤色成分の差分信号を 128 に変換する。
  • .jpg 出力なので format=yuvj420p でフルレンジ .jpg に指定する。

最適な値を調べるには

色が少なければコントラスト上げるだけでよいが、色が多いとコントラストを上げすぎると色が飛ぶのでコントラストを上げすぎない。圧縮率を高くするには黒と白の部分の値がどの値になるか eq フィルタの後に oscilloscope フィルタで調べてから lutyuv フィルタの下限と上限を指定して 0 と 255 に変換する。

oscilloscope フィルタで値を調べる

ffplay -i input -vf oscilloscope
ffplay -i input -vf eq=contrast=1.5,format=yuvj420p,oscilloscope
ffplay -i input -vf eq=contrast=1.5,lutyuv='st(0,gt(val,64)+gt(val,230));eq(ld(0),0)*0+eq(ld(0),1)*val+eq(ld(0),2)*255':128:128,format=yuvj420p,oscilloscope

関連記事

使ったフィルタなどの説明

使わなかったフィルタで関係するフィルタの説明

Viewing all 310 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>