一般来说,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 和其他一些三星设备必须设置:
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 最终单位手动解析分辨率。
// 注意我在这里使用 Xamarin。但是电话和事情几乎是一样的。我相当肯定 iOS VideoToolbox Xamarin Wrapper 中存在错误,所以是的。如果您曾经考虑将 Xamarin 用于视频解码,请记住这一点。它适用于一切,但任何稍微更定制或低级的东西。