ariblibを使ってmpeg2tsのSD部分を削除する

最近TS関連ソフトウェア総合スレを賑やかしている話題。それまでHDだった動画があるとき急にSDになることがあり、症状の典型例から「わかさ問題」とか「わかさトラップ」だとか言われる。質問者はこれの原因が Continuity Counter にあると思っているが、それよりも見るべきポイントがある。

>>638>>645で指摘されているように、EITのコンポーネント記述子やPMTのビデオデコードコントロール記述子を見て不要なパケットを削除するとよい。 >>638では「録画を保留」とあるけど、いったん全て録画してあとで加工するほうが間違いが起こりにくくてシンプルだと思う。****

ファイルのSD部分を捨ててHDだけ残すものを ariblib を使って簡易に行うスクリプトを書いた。

import sys
from itertools import dropwhile

from ariblib import TransportStreamFile
from ariblib.packet import pid

with TransportStreamFile(sys.argv[1]) as ts, open(sys.argv[2], 'wb') as output:
    # SDを捨ててHDを残す場合。逆に前番組のHDを捨ててSDを残す場合は4 (ARIB-STD-B10 第2部第6章 表6-60)
    video_pid = ts.get_video_pid(1)
    for packet in dropwhile(lambda p: pid(p) == video_pid, ts):
        output.write(packet)

ここでは PMT のビデオデコードコントロールデスクリプタのビデオエンコードフォーマットが 1 である最初のパケットを探してきて、その PID が出てくるまでパケットを捨て続けるという実装になっている。実装はシンプルだが十分ワークする。