1

samsung S6、Android 5.1.1でh264ストリームをデコードするために使用mediacodecしています.mediacodecへの入力バッファは「0001」で始まる必要があります(pps、spsを設定する必要はありません)、またはACodecがエラーを報告します.

また、mediaextractor を使用して mp4 ファイルを再生しようとしましたが、正常に動作しますが、mediacodec へのバッファが "0001" で始まっていません。

h264 ストリームのデコードにこのような制限がある理由がわかりません。現在、ソケットからストリームを分析し、データを小さなパッケージ (各パッケージは 0001 で始まる) に分割してから、メディアコーデックに渡す必要がありますが、非効率的です。

MediaFormat format = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, 1024, 1024);
4

2 に答える 2

0

一部の特定のデコーダーは、H264 NAL ユニットを "mp4" 形式 (異なる種類のスタートコードを使用) でデコードできる場合もありますが、すべてのデバイスで保証されているわけではありません。

Samsung の MediaExtractor のバージョンは、独自のデコーダーが処理できることがわかっている場合、この形式でそれを返す可能性があります。少なくとも、Samsung が MediaExtractor のバージョンでタイムスタンプを使用して同じ非標準的なことを行ったという前例があります

(ただし、MediaExtractor が現在のデバイスのデコーダーのみが処理できるデータを返すようにすることは、間違った IMO です。なぜなら、MediaExtractor を使用してファイルを読み取り、圧縮されたデータをネットワーク経由で別のデバイスに送信してデコードする場合があるためです。非標準形式のデータは間違っています。)

ただし、fadden が書いたように、MediaCodec は完全な NAL ユニットで動作するため、この形式でデータを提供する必要があります (効率が悪いと思われる場合でも)。この情報 (フレーム境界に関する) が簡単に利用できない形式でソケットを介してデータを受信する場合、それは MediaCodec 自体の問題ではなく、プロトコル形式の問題です (たとえば、RTP 受信の実装は簡単ではありません!)。完全なフレームが得られるまでランダムなチャンクをフィードできるのではなく、デコードする前に完全なフレームを必要とするという非常に一般的な制限です。これは、独自の実装が非効率的でない限り、非効率的であってはなりません。

于 2016-06-16T05:37:58.573 に答える
0

一般に、android は各入力に対して nal ユニットを期待します。一部のデバイスでは、h264 のメディア形式で csd-0/1 を設定すると一貫して機能しないことがわかりました。ただし、各パラメータ セットを入力バッファとしてフィードすると、メディア コーデックはそれをフォーマット変更として取得します。

int outputBufferIndex = NativeDecoder.DequeueOutputBuffer (info, 1000);
if (outputBufferIndex == (int)MediaCodec.InfoOutputFormatChanged) {
    Console.WriteLine ("Format changed: {0}", NativeDecoder.OutputFormat);
} else if (outputBufferIndex >= 0) {
    CodecOutputBufferAvailable (NativeDecoder, outputBufferIndex, info);
}

また、Nexus やその他の Samsung デバイスでは次の設定が必須であることに注意してください。

formatDescription.SetInteger(MediaFormat.KeyWidth, SelectedPalette.Value.Width);
formatDescription.SetInteger(MediaFormat.KeyHeight, SelectedPalette.Value.Height);
formatDescription.SetInteger(MediaFormat.KeyMaxInputSize, SelectedPalette.Value.Width * SelectedPalette.Value.Height);

私の状況では、これらの解決策を問い合わせることができて幸運です。ただし、SPS および PPS nal ユニットから解像度を手動で解析できます。

// 注: ここでは Xamarin を使用しています。しかし、呼び出しと物事はほとんど同じです。iOS VideoToolbox Xamarin Wrapper にバグがあることは確かです。ビデオのデコードに Xamarin を使用することを検討している場合は、そのことを覚えておいてください。わずかにカスタム化されたものや低レベルのものを除いて、すべてに最適です。

于 2016-06-22T10:15:12.600 に答える