StreamPlayer に不可解な問題があり、何か助けが必要です。
私が達成する必要がある主な目標は、MPEG-2 トランスポート ストリームを可能な限り最小のレイテンシで再生できる StreamPlayer です。このために、私はこのアプローチに従っています:
ストリームは、Java ベースの TS パーサーによって解析されます。MediaExtractor に似た、正常に動作する TSExtractor を実装しました。MediaExtractor を使用して可能なのと同じ方法で、選択したトラックのすべてのメディア サンプルを受信できます。
extractor.readSampleData(...);
extractor.advance();
AAC データをデコードするには、MediaCodec のインスタンスを作成して構成します。MediaExtractor クラスを使用して、これは通常
MediaFormat mediaFormat = extractor.getTrackFormat(i);
decoder = MediaCodec.createDecoderByType(mediaFormat.getString(MediaFormat.KEY_MIME));
decoder.configure(mediaFormat, null, null, 0);
TSExtractor.getTrackFormat(int track) メソッドで MediaFormat を初期化する必要があるため、使用します
MediaFormat mf = MediaFormat.createAudioFormat ("audio/mp4a-latm", getSampleRate(), getChannelCount());
すべての AAC サンプルには ADTS が含まれているため、
mediaFormat.setInteger(MediaFormat.KEY_IS_ADTS, 1);
この投稿を読んだ後、「csd-0」キーを使用して ESDS フレームを最終的に追加します
mediaFormat.setByteBuffer("csd-0", ByteBuffer.allocate(2).put(new byte[]{(byte) 0x11, (byte)0x90}));
ここで、値 0x11 と 0x90 は ADTS から抽出されます。
AAC サンプルをデコードしたいときは、デコーダーがポストします。
AAC decoder returned error 4097, substituting silence
ログに。
TSExtractor がサンプルを正しく抽出することを確認するために、VLC を使用して同じストリームを記録し、トランスコーディングせずに mp4 ファイルに再多重化し、生のストリームを変更しませんでした。これで、記録した mp4 ファイルで MediaExtractor を初期化し、TSExtractor と MediaExtractor によって作成されたサンプルを比較できます。トレイルアンドエラーを使用すると、非常に奇妙な動作が見つかりました。
MediaExtractor によって作成された mediaFormat を使用して MediaCodec を構成すると、MediaCodec は TSExtractor によって返された AAC サンプルを問題なくデコードします。私の TSExtractor によって作成された HashMap を基本的にラップする MediaFormat と MediaExtractor によって作成されたものを比較すると、次のような違いがあります。
MediaExtractor によって作成されました:
mediaFormat: {max-input-size=1212, durationUs=77428875, is-adts=1, channel-count=2, mime=audio/mp4a-latm, csd-0=java.nio.ByteArrayBuffer[position=0,limit =2,容量=2]、サンプルレート=48000}
TSExtractor によって作成:
mediaFormat: {is-adts=1, channel-count=2, mime=audio/mp4a-latm, csd-0=java.nio.ByteArrayBuffer[position=2,limit=2,capacity=2], sample-rate= 48000}
TSExtractor によって作成された MediaFormat を MediaExtractor によって作成されたものと同様に採用しても、デコーダーは、作成された自己を使用して同じエラーを出し、他のものを使用して問題なくデコードします。
どんな助けでも本当に役に立ちます。