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 とスタンドアロン アプリを投稿していただけないでしょうか。