便利ツール

MPEG2-TTSをOSSでデコードする方法

2024年2月14日

はじめに

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)と呼びます。

SANACHAN
SANACHAN
本記事は、この TTS に関する内容です。

 

MPEG2-TTS とは?

MPEG2-TTS のパケット構造(出典:Qiita - TTSの仕組み

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

SANACHAN
SANACHAN
つまり、日本独自の規格ということになります。

 

日本独自がゆえに、ffmpeggstreamer などの多くの OSS(Open Source Software)では、
このフォーマットに対応していないのが2024年現在の現状です。

 

OSS でデコードすることの重要性

前述した ffmpeggstreamer は、映像のデコードやトランスコードなどで非常に有名な OSS です。
標準的なコーデック、MUX(マルチプレクサ)に幅広く対応しており、世界中の人々が使用しています。

OSS でデコードできると以下のような重要な利点を得ることができます。

  • 信頼性
    ソースコードが一般に公開され、多くの人が利用しているため、
    信頼性の高いソフトウェアを無料で利用できます。
  • 汎用性
    世界標準規格に対応しており、コーデックや MUX に変更があってもすぐに対応できます。
    入力ソースもファイルやネットワークを問わず、動作させることができるようになります。
  • コミュニティのサポート
    ffmpeg や gstreamer は、活発なコミュニティがあります。
    バグの報告や修正、定期的なアップデートやセキュリティパッチも無償で得ることができます。

以上の点から、コスト効率性を考えても、OSS を利用することで開発コストを大幅に抑えることができ、
拡張性を備えたソフトウェアを簡単に開発することができます。

SANACHAN
SANACHAN
今からデコーダを独自に実装するなど、とってもナンセンスですね。

 

OSS での実装例

冒頭で記載した通り、日本独自の規格である MPEG2-TTS は、多くの OSS では対応していません。
先の ffmpeggstreamer も例外ではありません。

 

しかし、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 にも対応しています。

 

SANACHAN
SANACHAN
今の OSS の現状でも、私の職場では未だにデコーダに開発費をかける傾向があり、
本記事を投稿しようと思った次第です(笑)

 

gstreamer をビルドする方法(Windows)

gstreamer を利用した解決策を紹介したものの、Windows 向けにはビルド環境の最新記事が少ない。
私がローカルでビルドする際に参考になった記事のリンクを貼っておきます。

Windows10、gstreamer-1.22.10、Visual Studio 2022 でビルドした環境です。

SANACHAN
SANACHAN
ウィルスバスターの停止は必須でした!

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-便利ツール
-, , , ,