3

JavaScript で MPEG-TS から変換して MP4 ファイル (h.264 ビデオと AAC オーディオを含む) を生成し、blob URL を介してブラウザーで再生します。Chrome ではすべて正常に動作し、開発者コンソールから BLOB の URL を取得してダウンロードすると、生成されたファイルは Windows Media Player でも正常に再生されます。ただし、Firefox は、それらが破損していると主張しています。

問題をオーディオ メタデータの ESDS ボックスの問題に絞り込みました。ソース MPEG-TS ファイルを他の手段 (ffmpeg など) で再パッケージ化し、生成したファイルを 16 進エディターで手動編集して、他のソフトウェアで生成された同等のファイルから ESDS ボックスに貼り付けると、Firefox は問題なく動作します。

ESDS ボックスを構築する私のコード。(そして、私は問題を追跡しています)

私はかなり単純な MPEG 仕様からの書き起こしプロセスによってそれを書き込もうとしましたが、それは私がそれを台無しにしなかったという保証はありません。Chrome と Windows Media は私のファイルを問題なく再生するので、それが実際に私のファイルのエラーであり、何らかの形で無視できるのか、それとも Firefox の問題なのかはわかりません。私は前者を疑っていますが、よくわかりません。

適切な ESDS ボックスを構築する方法について、誰かが何らかの洞察、またはおそらく簡単で理解しやすいリファレンスを手に入れましたか?

EDIT : 同じ入力ファイルに対して生成されたいくつかの異なる ESDS セクションを次に示します (16 進バイトとして、私の 16 進エディタからコピー):

私の:

00 00 00 27 65 73 64 73 00 00 00 00 03 22 00 00
02 04 14 40 15 00 00 00 00 00 3a f1 00 00 2d e6
05 02 12 10 06 01 02

mpegts :

00 00 00 33 65 73 64 73 00 00 00 00 03 80 80 80
22 00 02 00 04 80 80 80 14 40 15 00 00 00 00 00
00 00 00 00 00 00 05 80 80 80 02 12 10 06 80 80
80 01 02

ffmpeg:

00 00 00 2c 65 73 64 73 00 00 00 00 03 80 80 80
1b 00 02 00 04 80 80 80 0d 40 15 00 00 00 00 01
5f 42 00 00 00 00 06 80 80 80 01 02

奇妙なことに、以前はこれに気づきませんでした。Firefox は ffmpeg の出力でビデオを再生しますが、Firefox も Windows Media も実際にはサウンドを再生しません (Chrome は再生します)。ただし、Firefox と Windows Media はどちらも、mpegts からの出力を使用して音声付きのビデオを再生できます。私の場合、Chrome と Windows Media は音声付きのビデオで再生されますが、Firefox はまったく再生されず、ビデオが破損していると主張します。

4

4 に答える 4

2

さて、私は自分の質問に対する答えを見つけました。私の ESDS ボックスと他のソフトウェアによって生成されたものとの違いを熟考すると、最大の違いはこれらの 0x80 パディング バイトの存在であることが明らかになりました。これらのバイトは、すべての ES 記述子タグ番号の後に 3 つありました。それらを追加すると、他のほとんどすべてが整列し、ほとんど同じように見えます.

MP4 ファイルまたは ISOBMFF の MPEG 仕様には、これらのバイトが存在する理由についての言及はありませんが、それらを追加すると機能します。Firefox は、ファイルが破損しているとは見なしなくなりました。

于 2015-06-24T04:14:42.530 に答える
2

ES Descriptor Tag 番号の後にそれぞれ 0x80 の 3 バイトを追加することで、ソリューションを見つけました。すべてのブラウザでうまくいったことを嬉しく思います。

あなたやあなたのコードの将来のユーザーに役立つかもしれない1つの洞察を共有させてください:

「..MP4 ファイルまたは ISOBMFF の MPEG 仕様には、これらのバイトが必要な理由についての言及はありませんが、それらを追加すると機能します..」

mp4ESDSbox.javaのこのリンクをよく見ると、ESDS アトムが 5 つのセクションに分割され、各セクションにバイトが埋め込まれていることがわかります80 80 80。これらの 3 バイトは、「オプションの拡張記述子タイプ タグ文字列」として記述され、可能なタイプの値は.. 80または81またはFE

正しい道を進んでいますが、最初のセクションしかパディングしていません。

MP4Muxer.js: (A) 現在持っているもの...

00 00 00 27 65 73 64 73 00 00 00 00 03 80 80 80
22 00 00 02 04 14 40 15 00 00 00 00 00 3A F1 00
00 2D E6 05 02 12 10 06 01 02

MP4Muxer.js: (B) どうあるべきか…

00 00 00 3365 73 64 73 00 00 00 00 03 80 80 80
22 00 00 02 04 80 80 80 14 40 15 00 00 00 00 00
3A F1 00 00 2D E6 05 80 80 80 02 12 10 と 06 80
を比較

FFMpeg ESDS for random AAC track: 20 80新 (B) バージョン

00 00 00 33 65 73 64 73 00 00 00 00 03 80 80 80
22 00 01 00 04 80 80 80 14 40 15 00 00 00 00 01
F4 74 00 01 F4 74 05 80 0 20 1 06 80 80
80
01 02

バージョン B) のバイト構造を FFMpeg によって作成されたものと比較すると、完全に整列していることがわかります。一部の値は、同じオーディオ データから作成されていないため、わずかに異なります。

最初の 4 バイト (整数サイズ) を(10進 == 39 バイト長) だっx33た元の値から (10 進 == 51 バイト長)に変更したことに注意してください。x27

于 2015-06-28T16:51:54.850 に答える
1

ISO 14496-1 仕様の関連部分への参照を探している人向け:

  • セクション 8.6.5 は、ES_Descriptorから継承するクラスの形式を指定しますBaseDescriptor
  • セクション 8.2.2 はBaseDescriptor、展開可能なクラスであると定義しています。
abstract aligned(8) expandable(2^28 - 1) class BaseDescriptor : bit(8) tag=0
{
    // empty. To be filled by classes extending this class.
}
  • セクション 14.3.3 では、次の長さのエンコーディングを持つ拡張可能なクラスについて説明します。
int sizeOfInstance = 0;
bit(1) nextByte;
bit(7) sizeOfInstance;
while (nextByte)
{
    bit(1) nextByte;
    bit(7) sizeByte;
    sizeOfInstance = sizeOfInstance << 7 | sizeByte;
}

この定義と a の展開可能な最大サイズからわかるように、最大BaseDescriptor​​ 4sizeOfInstanceバイトでエンコードできます。厳密に必要とされるよりも多くのバイトが使用されている場合、サイズには実際に0x80バイトがプレフィックスとして付けられているようです。

于 2021-12-02T10:24:46.633 に答える