はじめに
MPEG-2(Moving Picture Experts Group)は、映像や音声を多重化する ISO/IEC の標準規格です。
DVD や放送で主に使用されており、ごく一部の公共インフラでも使用されています。
映像の ES(Elementary Stream)、音声の ES を適当なサイズに分割してパケット化したものを
PES(Packetized Elementary Stream)と呼び、伝送する形式の用途別に PS(Program Stream)、
TS(Transport Stream)の 2 種類が定義されています。
更に、TS パケットの先頭 4 バイトにタイムスタンプ情報を付加したものを
特に TTS(Timestamped Transport Stream)と呼びます。

MPEG2-TTS とは?

MPEG2-TTS のパケット構造(出典:Qiita - TTSの仕組み)
データの詳しい構造は、Wiki などを読んでいただくと分かると思いますが、
MPEG2-TTS は、ARIB(アライブ)が規格化しているフォーマットなのです。

日本独自がゆえに、ffmpeg や gstreamer などの多くの OSS(Open Source Software)では、
このフォーマットに対応していないのが2024年現在の現状です。
OSS でデコードすることの重要性
前述した ffmpeg や gstreamer は、映像のデコードやトランスコードなどで非常に有名な OSS です。
標準的なコーデック、MUX(マルチプレクサ)に幅広く対応しており、世界中の人々が使用しています。
OSS でデコードできると以下のような重要な利点を得ることができます。
- 信頼性
ソースコードが一般に公開され、多くの人が利用しているため、
信頼性の高いソフトウェアを無料で利用できます。 - 汎用性
世界標準規格に対応しており、コーデックや MUX に変更があってもすぐに対応できます。
入力ソースもファイルやネットワークを問わず、動作させることができるようになります。 - コミュニティのサポート
ffmpeg や gstreamer は、活発なコミュニティがあります。
バグの報告や修正、定期的なアップデートやセキュリティパッチも無償で得ることができます。
以上の点から、コスト効率性を考えても、OSS を利用することで開発コストを大幅に抑えることができ、
拡張性を備えたソフトウェアを簡単に開発することができます。

OSS での実装例
冒頭で記載した通り、日本独自の規格である MPEG2-TTS は、多くの OSS では対応していません。
先の ffmpeg や gstreamer も例外ではありません。
しかし、RTP を入力とする場合に限っては、gstreamer のプラグインが使えます。
C言語向けとRust言語向けのプラグインがあり、少し機能が異なります。
どちらも実行バイナリが生成されるため、実行環境に差は発生しません。
【C言語版】gst-plugins-good - rtpmp2tdepay
パッケージに含まれている rtpmp2tdepay は、skip-first-bytes というプロパティがあり、
指定したバイト数、RTP パケットの先頭を読み飛ばすことができるようになっています。
また、rtpmp2tdepay のコードは、いたるところに 188 バイトを前提としたロジックが存在するため、
192 バイトを前提としたコードに改修することで、MPEG2-TTS をデコードできるようになります。
ソースコード
いくつの MPEG2-TTS パケットを RTP の 1 パケットとして送出するかに依存しますが、
これらを組み合わせるか、またはどちらか片方だけでデコードできるようになるはずです。
MPEG2-TTS の構造を理解していれば、パイプラインの変更(skip-first-bytes)、
またはコードを改修したプラグインを用意して試すことですぐに解決できるでしょう。
【Rust言語版】gst-plugins-rs - rtpmp2tdepay2
これまでの gstreamer のプラグインを Rust という言語で書き直したプラグインです。
コミュニティでの議論などを経て、改良されているものもあります。
rtpmp2tdepay もその一つで、rtpmp2tdepay2 というプラグインが実装されています。
Rust 言語で書かれた rtpmp2tdepay2 は初めからパケットサイズの切替に対応しており、
192 バイトの MPEG2-TTS にも対応しています。
ソースコード

本記事を投稿しようと思った次第です(笑)
gstreamer をビルドする方法(Windows)
gstreamer を利用した解決策を紹介したものの、Windows 向けにはビルド環境の最新記事が少ない。
私がローカルでビルドする際に参考になった記事のリンクを貼っておきます。
Windows10、gstreamer-1.22.10、Visual Studio 2022 でビルドした環境です。
- ビルド環境構築:gstreamer 公式ページ
- ビルド方法:gstreamer 公式ページ
- 古い記事だけど参考になったもの:Qiita - Windows環境でGStreamerのSRTプラグインをビルドする
