ブロッキングアーティファクトを除去する deblock

不可逆圧縮したときに生じる圧縮アーティファクトを除去するdeblockフィルタの使い方。

圧縮アーティファクト – Wikipedia

基本コマンド

ffmpeg -i input -vf deblock=filter=1:block=8:alpha=0.098:beta=0.05:gamma=0.05:delta=0.05:planes=15 output
ffplay -i input -vf deblock=1:8:0.098:0.05:0.05:0.05:15

ブロックサイズ4ピクセルの弱いフィルタ
ffplay -i input -vf deblock=filter=weak:block=4
ブロックサイズ4ピクセルの強いフィルタにエッジのでブロックを強化
ffplay -i input -vf deblock=filter=strong:block=4:alpha=0.12:beta=0.07:gamma=0.06:delta=0.05
上と似ているが最初のチャンネルしか効果がない
ffplay -i input -vf deblock=filter=strong:block=4:alpha=0.12:beta=0.07:gamma=0.06:delta=0.05:planes=1

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

Continue reading “ブロッキングアーティファクトを除去する deblock”

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

2つ入力した映像を比較し PNSR(Peak Signal to Noise Ratio:2つの映像、または画像の同位置のピクセルの輝度を比較する指標)。MSE(mean squared error)は PSNR を計算するのに使われる。比較する動画は同じ解像度とfps、ピクセルフォーマットである必要がある。

ファイルの入力順が逆だったのを訂正した。2021年8月11日
1入力がオリジナルの動画、2入力がSSIMを計算する動画ではなく、1入力がSSIMを計算する動画で、2入力がオリジナルの動画でlibvmafフィルタと同じ順番。

視覚評価に重きを置いたxpsnrも公開された。2024年9月9日

海外カンファレンスで得た知見を最大化する 〜 NAB Show 2018 編 〜 : developers.cyberagent.co.jp

Continue reading “2つの映像の画質評価をする PSNR”

2018年5月のニコ生統計

集計期間は週間のニコ生統計の1ヶ月分である。2018年からカテゴリタグの割合は今までと変わらないが、1枠30分の割合が少なくなったので来場者数とコメント数の6000以上を除かないすべての放送を対象にした。それに伴い平均値は除外した。来場者数はTS視聴可能時間が来れば増え、TS来場者数を含まずに計算することは困難な仕様なので、翌日(当日)の朝に前日の6時から当日の6時までを取得している。

全放送を対象にしたので改めて以前の放送のデータを使って調べ直している。

Continue reading “2018年5月のニコ生統計”

特定の映像フレームや音声サンプルを出力するselect, aselect

特定のフレーム間隔での出力ならtrim、atrimフィルタでもよいが、selectフィルタはピクチャータイプやインターレースタイプの指定でも出力できる。難点はどちらもデコードしながら処理を進めるがtrim、atrimフィルタはデコード開始終了を指定できるのに対して、select、aselectフィルタは区間を区切ってもストリーム全体をデコードするので尺が長いほど処理が長くなる。一定周期でフレームを間引くならshuffleframesフィルタもある。

FFmpeg 8.0に上がるときにaselectフィルタが一時的に機能していなかった。
#20949 – Fixed broken aselect filter – FFmpeg/FFmpeg – FFmpeg Forgejo
fate/filter-audio: Added test for aselect · 32f73138f5 – FFmpeg/FFmpeg – FFmpeg Forgejo

trim フィルタの使い方
指定フレーム毎に順番を入れ換える shuffleframes

Continue reading “特定の映像フレームや音声サンプルを出力するselect, aselect”

2018年4月のニコ生統計

集計期間は週間のニコ生統計の1ヶ月分である。2018年からカテゴリタグの割合は今までと変わらないが、1枠30分の割合が少なくなったので来場者数とコメント数の6000以上を除かないすべての放送を対象にした。それに伴い平均値は除外した。来場者数はTS視聴可能時間が来れば増え、TS来場者数を含まずに計算することは困難な仕様なので、翌日(当日)の朝に前日の6時から当日の6時までを取得している。

全放送を対象にしたので改めて以前の放送のデータを使って調べ直している。

Continue reading “2018年4月のニコ生統計”

各フィールドをフレームに変換する separatefields

分離フィールドを交互に挟んだフレームにするseparatefieldsフィルタ。フレーム数とフレームレートを2倍に、出力映像の縦解像度を半分にする。トップ、ボトムどちらのフィールドを先に出力するかは動画情報による。もし間違っているのならsetfieldフィルタを先に指定する。

基本コマンド

ffmpeg -i input -vf separatefields output
ffplay -i input -vf separatefields

分離フィールドを元の映像に戻すにはweaveフィルタを使う。
ffmpeg -i input -vf separatefields,weave output
ffplay -i input -vf separatefields,weave

各フィールドを縦に並べるにはselectフィルタで偶数奇数に分割して、hstackフィルタで縦に並べる。上のフレームが先に動けばトップフィールドファースト。下のフレームが先に動けばボトムフィールドファーストになる。
ffplay -i input -vf separatefields,select='1*mod(n-1\,2)+2*mod(n\,2)':n=2,vstack

上のままだとPTSが一致してないので揃えるならsetptsフィルタを使う。
ffplay -i input -vf separatefields,select='1*mod(n-1\,2)+2*mod(n\,2)':n=2[1],setpts=PTS-STARTPTS[0v];[1]setpts=PTS-STARTPTS,[0v]vstack

ilフィルタでも同じことができる。PTSリセットが不要なのでこちらの方が扱いやすい。
ffplay -i input -vf il=l=d:c=d

元の映像を左に、フィールドを積み重ねた映像を右に並べる。
ffplay -i input -vf split[0],separatefields,select='1*mod(n-1\,2)+2*mod(n\,2)':n=2,vstack,[0]hstack

23プルダウンを逆テレシネする。
-vf "separatefields,shuffleframes=0 1 4 3 6 5 8 9 -1 -1,setfield=tff,weave,setpts=(N*1001)/(24000*TB),setparams=field_mode=prog" -r 24000/1001 -fps_mode vfr

末尾フレーム抜けを抑えるためにtpadフィルタで末尾フレームをコピーして増やす。
-vf "tpad=stop=2:stop_mode=1,separatefields,shuffleframes=0 1 4 3 6 5 8 9 -1 -1,setfield=tff,weave,setpts=(N*1001)/(24000*TB),setparams=field_mode=prog" -r 24000/1001 -fps_mode vfr

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

フィールドオーダーのフラグを建てるsetfield

インターレースの映像でトップとボトムのどちらが最初なのかを指定するsetfieldフィルタ。フィールドオーダーが明示されてないときに使い、フレーム自体に変更を加えない。フィールドタイプを変更するのはfieldorderフィルタ。おそらく同じことがsetparamsフィルタでもできる。

フィールドオーダーを変更するfieldorder
フィールドタイプや色域を記述するsetparams

Continue reading “フィールドオーダーのフラグを建てるsetfield”

簡易的なフレーム補間をする framerate

本格的なフレーム補間はminterpolateフィルタがあるが、framerateは前後フレームを平均化してフレーム補間を行う。

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

基本コマンド

ffmpeg -i input -vf framerate=fps=50:interp_start=15:interp_end=240:scene=8.2:flags=scd output
ffplay -i input -vf framerate=50:15:240:8.2:scd

オプション

  • fps[int]
    出力フレームレート数の指定
    既定値:50
  • interp_start[int]
    線形補間される範囲の最初の値
    既定値:15
    範囲:0 から 255 まで
  • interp_end[int]
    線形補間される範囲の最後の値
    既定値:240
    範囲:0 から 255 まで
  • scene[double]
    シーンチェンジが検出されるレベルの指定。低い値だと補間しにくくなり、高い値だと補間しやすくなる
  • flags[flags]
    フラグの指定
    scene_change_detect, scd
    sceneを使う。既定値

可変フレームを検出する vfrdet

可変フレームか固定フレームかを調べることが出来るvfrdet(Variable frame rate detect)フィルタ。コンソールには可変フレーム数と固定フレーム数、 PTS間隔の最小値、最大値と平均値が表示される。

2019年10月29日に平均値が追加された
ffmpeg.git/commitdiff : avfilter/vf_vfrdet: also report average delta

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

基本コマンド

ffmpeg -i input -an -vf vfrdet -f null -

表示ログの例。固定フレームなら右に総フレーム数、左に可変フレーム数。0開始のフレーム数なので実際のフレーム数は1を足す。
[Parsed_vfrdet_0 @ 000000000295fe80] VFR:0.000000 (0/34046)

可変フレームなら右(15123)が固定フレーム数、左(60562)が可変フレーム数。min, max, avgはPTS間隔の最小値、最大値と平均値。max: 133は前後のPTS間隔の最大値が 133*timebase の意味になる。可変フレーム数はおそらくPTS間隔がその動画の一般的な間隔とは違う前後フレームを可変フレーム数として計算している。

VFR:0.800185 (60562/15123) min: -166 max: 133 avg: 33

5分の1フレーム間引いた可変フレームレートの動画サンプルを作る。
ffmpeg -f lavfi -i testsrc2=d=10 -vf select='mod(n,5)' -c:v ffv1 output.mkv

ffmpeg でのフレームレート設定の違い
特定の映像フレームや音声サンプルを出力する select, aselect

timebaseを調べる方法。
ffprobe -v error -i input -select_streams v:0 -show_entries stream=time_base -of csv=print_section=0

PTS間隔を調べるにはffprobeで調べる方法と、mkvtimestamp_v2で調べる方法があるが、2つの方法が一致するとは限らない。

ffprobeで調べる。
ffprobe -v error -i input -select_streams v:0 -show_entries packet=pts_time -of default=noprint_wrappers=1:nokey=1 > pts_time.txt

ffprobe の使い方

フレーム当たりのタイムスタンプミリ秒。
ffmpeg -i input -an -f mkvtimestamp_v2 mkvtimestamp_v2.txt

タイムスタンプファイルを元にPTSを修正するにはmp4fpsmodを使う。ただしバイナリは配布されていない。
mp4fpsmod -t mkvtimestamp_v2.txt input.mp4 -o output.mp4

nu774/mp4fpsmod: mp4 time code editor