MP4インスペクターを使ってビデオトランスマックス出力を分析する

Picture of bsp-admin-1
bsp-admin-1
ブログ・プレースホルダー画像

videojs-contrib-hlsの中核をなすトランスムーサーであるMux.jsを構築しているとき、私たちはある問題に直面した。それは、Mux.jsからの出力が正しいかどうかをどうやって判断するかということだ。

初期の段階で、MPEG2-TSセグメントからFFmpegでMP4を作成し、メディアソース拡張機能(MSE)のあるブラウザ(当時はChromeのみ)で再生する方法を何とか見つけ出した。しかし、トランスムクサーの出力とFFmpegの出力を比較する簡単な方法が必要でした。2つの出力がバイト的に同一である可能性は極めて低いため、比較はMP4フォーマットを意識する必要があった。

MP4インスペクターの構築

MP4を分析し、関連するボックスとその内容をJSONのようなダンプで表示するツールだ。Mux.jsからの出力のダンプを生成し、FFmpegで生成された既知の良好なフラグメントと比較することで、トランスムクサーの出力がどこが違うのかを知ることができた。

mp4 インスペクターは、2 つのセグメントの差分をグラフィカルに色分けできるように、ウェブページとして作成しました。時間の経過とともに、このページには video 要素が追加され、セグメントをトランスマックスした結果を video 要素の MediaSource に直接追加するようになりました。

開発が進むにつれて、私たちは時々、新しく興味深い方法で失敗するストリームに遭遇した。これらの失敗のいくつかは、確かにMux.jsのバグによるものだった。Mux.js自体がより堅牢になるにつれて、失敗の原因はストリームの問題や、MSE仕様の特定の実装の問題に起因することが多くなりました。

やがて私たちは、動画の内部で何が起きているのかをもっと知る必要があることに気づきました。メディア・コンテナ・レベルで起きていることだけでなく、もっと深く、つまり動画データそのものを覗き見る必要があったのです。そのために、私たちはThumbcoilを作りました。

Thumbcoilは、MP4またはMPEG2-TSコンテナファイルに含まれるH.264ビデオビットストリームの内部を覗き見ることができるように設計されたツールスイートです。Thumbcoilのツールを使用すると、サポートされている2つのメディアコンテナフォーマットの内部構造を詳細に見ることができます。

さらに、このツールは、H.264ビットストリームを構成する最も重要なNALユニットに含まれる情報を表示する機能を備えている。ビデオエンコーダーがデコーダーのためにどんな秘密情報を隠し持っているのか、不思議に思ったことはないだろうか。Thumbcoilを使えば、自分の目で確かめることができます。

MP4インスペクターを作った理由

2016年には、メディア・コンテナの構造とその中に含まれるデータを多少グラフィカルに表示する優れたツールはほとんどありませんでした。動画再生の問題をデバッグするのは、通常、さまざまな難解なFFmpegやFFprobeの呪文を伴う退屈な作業です。残念なことに、FFprobeは最高でも、私たちが興味を持っているデータのごく一部しか出力できません。

例えば、様々なパラメータセット内の正確なデータは、コマンドラインからは入手できません。FFprobeの内部では、そのデータは分析され保存されますが、その情報を人間が読める形でダンプする簡単な方法はありません。

H.264では、2つの特殊なタイプのNALユニットがある。 seq\_parameter\_set (SPS)と pic\_parameter\_set (PPS)。これら2つのNALユニットには多くの情報が含まれている。デコーダーは映像を再構成するためにこの情報を必要とする。

Thumbcoilは、パラメータ・セット情報を非常に詳細に提供するだけでなく、その情報を周囲のコンテキスト(その情報が含まれるボックスや、その情報が指定されたフレーム)とともに保持する。このコンテキストは、ストリームの問題や特異性を理解する上で非常に重要であることが多い。

MP4インスペクターができるまで

Thumbcoilがどのようにパラメータ・セットを分析するかについて、より興味深いことの1つは、内部的に各NALユニット・タイプに対して「コーデック」と呼ばれるものを構築することである。これらのコーデックは、基本的に派手なパーサー・コンビネーター・タイプのセットアップを使用して指定される。

つのパラメータセットのデータの多くは、指数-ゴロムエンコーディングと呼ばれる方法で保存されている。この方法は、数値を格納するために可変ビット数を使用し、特に小さくなりがちな値に適している。

コーデックを構築するために使用される各関数は、デコードとエンコードという2つの関数を持つオブジェクトを返す。つまり、例えば seq\_parameter\_set NALユニットを一度だけ使用すれば、その特定のNALユニットのビットストリームを分析し、書き込むことができる。

NALユニットコーデックを指定するために使用される文法は、H.264仕様(ISO/IEC 14496-10)で使用されている文法に非常に似ている。Thumbcoilのコーデックが理解できるデータ型は、いくつかの拡張を除けば、符号付き整数や符号なし指数ゴロム符号化整数など、仕様で定義されているものと同じ型に過ぎない。

パラメータセットに加え、Thumbcoilは slice\_header データを分析する。しかし、我々は実際の slice\_data というのも、その細部にまで踏み込むと、物事はすぐに難しくなり、役に立たなくなるからだ。

他のVideo.jsプロジェクトと同様に、Thumbcoilはオープンソースソフトウェアであり、Githubでの提案、問題、貢献を歓迎します。

専門用語集

  • トランスマキサー。トランスマキサーは、あるファイルフォーマットに含まれるメディアを取り込み、内部から生の圧縮ビデオとオーディオを取り出し(デマックスと呼ばれるプロセス)、再圧縮を行わずに圧縮データを別のフォーマットに再パッケージ化(リマックスと呼ばれる)する。
  • MP4。MP4ファイルはボックスという階層的な論理単位で構成され、便利なことに、すべて32ビットの長さと32ビットのボックスタイプで始まります。ボックスはしばしば他のサブボックスを含む。
  • メディアコンテナ。MP4などのメディアコンテナ内では、ビデオとオーディオはビットストリームと呼ばれるデータに含まれている。ビットストリームは、オーディオ信号やビデオフレームを表現するためにエンコーダーによって生成されるデータです。一般的なビットストリームには、オーディオ用のAACとビデオ用のH.264(AVC)があります。
  • NALユニット。H.264でエンコードされたビットストリームは、NAL(Network Abstraction Layer)ユニットと呼ばれるもので構成される。NALは、できるだけ効率的にビットを使用するように設計されたシンプルなパケットフォーマットです。
Back in July 2025, Brightcove unveiled an ambitious roadmap with a dual focus on innovation and quality of experience...
Our teams have been hard at work making the Brightcove platform more powerful, more reliable, and more insightful for...
Vertical Videos Experience lets you deliver a TikTok/Reels-style vertical feed on the web, powered by Brightcove. It’...

動画コンテンツの管理・活用はできていますか?

御社の動画マーケティング活動を強化し、必要な結果とROIを生み出すお手伝いをする方法については、
弊社までお問い合わせください。