3

私は、MP4 のアトムを問題なく読み取り、それらをつなぎ合わせることができる MP4 パーサーを作成しました。その結果、Quicktime で開くことができる技術的に有効な MP4 ファイルが作成されますが、オーディオを再生することはできません。タイミング/サンプリング情報はすべてオフです。私はおそらくオーディオにしか興味がないことを言及する必要があります。

私がやっていることは、既存の MP4 から moov atom/etc を取得し、ファイル内の mdat アトムのサブセットのみを取得して、新しい、より小さな MP4 を作成しようとしています。そうすることdurationで、アトムの とヘッダーmvhdの期間を変更しました。mdiaこのファイルには編集されたアトムがないtkhdので、そこにある期間を変更する必要はないと思います-何が欠けていますか?

新しい MP4 を作成する際にmdat、幅の広いボックスでブロックを適切に分割し、「mdat」ヘッダー/サイズを適切な場所に保持します。新しいコンテンツでサイズを更新するようにします。

今では完全に 110% 可能性があり、フォーマットに関する重要な何かが欠けている可能性がありますが、これが可能である場合は、最終的なピースを手に入れたいと思っています. 誰かが入力/アイデアを得ましたか?

コードは次のリンクにあります。

https://gist.github.com/ryanmcgrath/958c602cff133bd7fa0b

4

1 に答える 1

35

stblここで暗闇の中で突き刺して、オフセットを適切に更新していないと言います。少なくとも私は(一見すると)あなたのpythonがどこでもそれをしているのを見ませんでした。

STSC

データの場所から始めましょう。パケットはチャンクの観点からファイルに書き込まれ、ヘッダーはこれらのチャンクの各「ブロック」が存在する場所をデコーダーに通知します。テーブルには、stscチャンクごとにいくつのアイテムが存在するかが示されています。はfirst chunk、その新しいチャンクが開始する場所を示します。少しややこしいですが、私の例を見てください。これは、8 番目のチャンクまで、チャンクごとに 100 個のサンプルがあることを示しています。8 番目のチャンクには 98 個のサンプルがあります。

ここに画像の説明を入力

STCO

とはいえ、これらのチャンクのオフセットがどこにあるかを追跡する必要もあります。stcoそれがテーブルの仕事です。したがって、ファイル内のどこがチャンク オフセット 1、チャンク オフセット 2 などになります。

ここに画像の説明を入力

のデータを変更する場合は、mdatこれらのテーブルを維持する必要があります。mdatデータを切り取って、デコーダが何をすべきかを知っていると期待することはできません。

これで十分ではないかのように、サンプル タイム テーブル ( stts)、サンプル サイズ テーブル ( stsz)、およびこれがビデオの場合は同期サンプル テーブル ( stss) も維持する必要があります。

STTS

sttsタイムスケールの単位でサンプルを再生する時間を指定します。オーディオを行っている場合、タイムスケールはおそらく 44100 または 48000 (kHz) です。

ここに画像の説明を入力

一部のデータを削除した場合、すべてが同期していない可能性があります。ここのすべての値の持続時間がまったく同じであれば問題ありません。

STSZ

stsz各サンプルのサイズをバイト単位で示します。これは、デコーダーがチャンクで開始し、各サンプルをそのサイズで処理できるようにするために重要です。

ここに画像の説明を入力

繰り返しますが、すべてのサンプル サイズがまったく同じであれば問題ありません。オーディオはほとんど同じ傾向がありますが、ビデオのものは大きく異なります (キーフレームなど)。

STSS

最後になりましたが、stssどのフレームがキーフレームであるかを示す表があります。私は AAC の経験しかありませんが、すべてのオーディオ フレームがキーフレームと見なされます。その場合、すべてのパケットを記述する 1 つのエントリを持つことができます。

ここに画像の説明を入力


元の質問に関連して、時間表示は各プレーヤーで常に同じように尊重されるとは限りません。最も正確な方法は、ヘッダー内のすべてのフレームの継続時間を合計し、それを合計時間として使用することです。他のプレーヤーは、トラック ヘッダーのメタデータを使用します。すべての値を同じに保つのが最善であることがわかりました。そうすれば、プレイヤーは満足します。

あなたがそれをすべて行っていて、スクリプトでそれを見逃した場合は、サンプルの mp4 とスタンドアロン アプリを投稿していただけないでしょうか。

于 2013-08-31T21:06:32.827 に答える