貧者のcomskip (3) - ffmpegのshowinfoがウソつきな件
無音検出とシーンチェンジをffmpegのフィルターでこなしてたんだが、showinfoフィルターのptsとpts_time、TBが整合しない例が出てきた。ffprobeやffmpegではTBは90Kと表示されている。
Duration: 01:54:07.91, start: 52853.131111, bitrate: 15803 kb/s Program 151 Metadata: service_name : ?BS?D+F|?1 service_provider: ?|����D+F| Stream #0:0[0x140]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, bt709, top first), 1440x1080 [SAR 4:3 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc Stream #0:1[0x141]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 199 kb/s
で、showinfoの方は、
[silencedetect @ 0x33d4880] silence_start: 59698.4 [Parsed_showinfo_2 @ 0x3621600] n: 979 pts:10745785784 pts_time:59698.8 pos:1352 3154900 fmt:rgb24 sar:4/3 s:1440x1080 i:P iskey:0 type:P checksum:094E5428 plane _checksum:[094E5428] mean:[138] stdev:[65.5] [Parsed_showinfo_2 @ 0x3621600] side data - pan/scan [Parsed_showinfo_2 @ 0x3621600] side data - stereoscopic information: type - 2D [Parsed_showinfo_2 @ 0x3621600] side data - unknown side data type 17 (6188 bytes) [Parsed_showinfo_2 @ 0x3621600] side data - unknown side data type 16 (8 bytes) [Parsed_showinfo_2 @ 0x3621600] side data - unknown side data type 12 (8 bytes) [silencedetect @ 0x33d4880] silence_end: 59699.3 | silence_duration: 0.959667
となる。検算してみると、pts÷pts_time=TBNになるはずなんだが、
10745785784 ÷ 59698.8 = 180000.029883348
となり、倍の値が出てしまう。ptsが嘘なのか、TBが嘘なのか分からない。しょうが無いので、自分で計算することにした。ffmpegのログファイルを喰わせて、最後のshowinfoのptsとpts_timeで計算する。
TB=$(grep Parsed_showinfo "$TEMP" | grep checksum | tail -n 1 | sed -r 's/^.*pts:\s?(.*) pts_time:\s?([0-9.]*) .*$/\1 \2/g' | awk '{printf "%d", $1 / $2}')