【发布时间】:2018-05-22 18:02:42
【问题描述】:
我有一个屏幕录制应用程序,它使用 MediaCodec 编码器对视频帧进行编码。这是我检索视频编码器的一种方法:
videoCodec = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC);
然后我尝试确定此编码器支持的最佳比特率模式,我的偏好顺序是“恒定质量”模式、可变比特率模式、恒定比特率模式。我就是这样做的:
MediaCodecInfo.CodecCapabilities capabilities = videoCodec.getCodecInfo().getCapabilitiesForType(MediaFormat.MIMETYPE_VIDEO_AVC);
MediaCodecInfo.EncoderCapabilities encoderCapabilities = capabilities.getEncoderCapabilities();
if (encoderCapabilities.isBitrateModeSupported(MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CQ)) {
Timber.i("Setting bitrate mode to constant quality");
videoFormat.setInteger(MediaFormat.KEY_BITRATE_MODE, MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CQ);
} else if (encoderCapabilities.isBitrateModeSupported(MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_VBR)) {
Timber.w("Setting bitrate mode to variable bitrate");
videoFormat.setInteger(MediaFormat.KEY_BITRATE_MODE, MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_VBR);
} else if (encoderCapabilities.isBitrateModeSupported(MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CBR)) {
Timber.w("Setting bitrate mode to constant bitrate");
videoFormat.setInteger(MediaFormat.KEY_BITRATE_MODE, MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CBR);
}
在我的三星 Galaxy S7 上运行它最终会选择 VBR 模式,即据说不支持恒定质量模式。但是,如果我只是将 BITRATE_MODE 设置为恒定质量,它不仅可以工作,而且实际上会产生比 VBR 模式更好的视频质量。
那么,如果此编码器显然支持恒定质量模式,为什么我会从 isBitrateModeSupported() 得到假阴性?我在这里遗漏了什么吗?
【问题讨论】:
-
在使用 MediaCodec 和三星设备时,我意识到这些设备中存在一些奇怪的行为。我不知道如何解决它,但也许你需要考虑一些对他们来说特别的东西。所以使用: if(android.os.Build.MANUFACTURER.toLowerCase().equals("samsumg"))
标签: android video-capture android-mediacodec video-encoding