Android 在高通编解码器上使用自定义分辨率时,MediaCodec会产生乱码

Android 在高通编解码器上使用自定义分辨率时,MediaCodec会产生乱码,android,jpeg,mp4,android-mediacodec,qualcomm,Android,Jpeg,Mp4,Android Mediacodec,Qualcomm,我正在使用MediaCodec API将一组JPEG编码为mp4。照片可以有任何分辨率,但我将所有照片调整为16的倍数,以确保它们的大小与MediaCodec兼容,并确保它们在编解码器视频功能返回的支持大小范围内 我发现,在一些使用OMX.qcom.video.encoder.avc编解码器的旧设备中,某些分辨率会产生乱码视频,如以下具有不同纵横比的示例所示。使用标准纵横比(如16:9、4:3等)时不会出现问题,只有在使用自定义纵横比时才会出现问题 原创 结果 原创 结果 在调查该问题时

我正在使用MediaCodec API将一组JPEG编码为mp4。照片可以有任何分辨率,但我将所有照片调整为16的倍数,以确保它们的大小与MediaCodec兼容,并确保它们在编解码器视频功能返回的支持大小范围内

我发现,在一些使用OMX.qcom.video.encoder.avc编解码器的旧设备中,某些分辨率会产生乱码视频,如以下具有不同纵横比的示例所示。使用标准纵横比(如16:9、4:3等)时不会出现问题,只有在使用自定义纵横比时才会出现问题

原创

结果

原创

结果

在调查该问题时,我通过另一位用户的问题发现,这可能与旧的高通设备要求YUV数据的Y平面在2K边界对齐有关。但是,我根本不直接使用YUV数据,而是使用输入曲面并通过OpenGL进行渲染

我的猜测是,也许输入表面的编解码器底层系统可以使用YUV缓冲区,而高通编解码器可以处理所有转换,这只是一个猜测。但如果是这样,那么,我是否可以使用任何公式来调整分辨率并使其符合这样的边界要求,即使它会产生一些裁剪?或者,如果我的猜测被误导了,那么是什么导致了这样的问题呢? 有关2K边界路线的说明,请参见下一个接受答案


我很难理解,YUV数据的均匀移动是如何导致缩略图中的惊人可见的。你能贴一张全分辨率的图片吗?还有,你怎么知道在解码(而不是编码)时没有出现乱码呢?我在问题中添加了更多的图像样本。我不确定如何验证编码是否正确,因为我正在使用InputSurface通过OpenGL执行渲染。但我已经通过在绘制完成后执行glReadPixels来验证渲染的图像是正确的,并且不会出现任何问题。只有在使用自定义纵横比时才会出现此问题。当使用标准纵横比(如16:9、4:3等)时,根本没有问题。我想你有一个.mp4文件,可以在另一个播放器中测试。嗯,你的第二张图片有不同的尺寸。。。相关?实际上是相同的维度。为了回答这个问题,我从设备上截取了屏幕截图并裁剪了图像,因此排除了导航栏、状态栏等。在裁剪图像时,我可能遗漏了几个像素。如果您的意思是,与前两幅图像的尺寸不同,那么只有两幅不同的测试具有不同的纵横比,以验证它是否以任何非标准的纵横比生成乱码图像。