一般に、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 を使用することを検討している場合は、そのことを覚えておいてください。わずかにカスタム化されたものや低レベルのものを除いて、すべてに最適です。