ffmpeg にはblend
フィルタのdifference128 grainextractオプションを使うことで特定シーン同士を比較して映像の差分を調べることができる。今回はニコ生の雑談放送でよく見られる静止画1枚を映しながら放送しているタイプの動画を調べるコマンドである。
最初に動画時間を調べる。このコマンドでは秒時間で出力される
ffprobe -i input.flv -show_entries format=duration -of json > duration.json
次に動画時間が短ければ2つの映像で、長ければ3つの映像で比較して静止画放送かどうかを調べる。
動画時間が短い180秒未満は2つを比較し、動画時間の3分の1と3分の2の映像を比較する。動画時間が長い180秒以上は3つで比較し、動画時間を2で割った中間と、最初から60秒後と最後から60秒前の映像を比較する
比較するコマンド。sp=XX の部分で比較したい映像の秒時間を指定する。映像に差が無ければ YUV ともに 128 が出力される
ffprobe -f lavfi -i "movie=input.flv:sp=60,setpts=PTS-STARTPTS,trim=end_frame=1[0];movie=input.flv:sp=840,setpts=PTS-STARTPTS,trim=end_frame=1[1];[0][1]blend=all_mode=grainextract,signalstats" -show_entries frame_tags=lavfi.signalstats.YAVG,lavfi.signalstats.UAVG,lavfi.signalstats.VAVG -of json > signalstats_YUV01.json
このとき映像が読み込めなかったら一度 remux する
ffmpeg -analyzeduration 30M -probesize 30M -i input.flv -c copy -sn output.flv