预览分辨率与编解码器分辨率不匹配

时间:2015-04-01 08:04:37

标签: android android-camera mediacodec

我正在尝试在设备之间传输视频。我想尽可能支持旧设备。所以我从Gingerbread(API 10)上的MediaRecorder课开始,但它有问题。所以现在,我要转向Jelly Bean(API 16)和MediaCodec

我正在向Camera PreviewCallback中的编解码器提供数据。我必须使用相同的分辨率进行预览,以及编解码器。但是在我们的一些测试设备上,预览分辨率和编解码器及其分辨率之间没有交叉。

那么,如何在这些设备上捕获视频?我知道createInputSurface中有MediaCodec,但它需要API 18,我必须删除over 35 %设备,这是不可接受的。

那么如何解决呢?

寻找最佳解决方案的代码:

CamcorderProfile bestProfile() {
    final int[] profiles;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        profiles = new int[]{CamcorderProfile.QUALITY_HIGH, CamcorderProfile.QUALITY_2160P, CamcorderProfile.QUALITY_1080P, CamcorderProfile.QUALITY_720P, CamcorderProfile.QUALITY_480P, CamcorderProfile.QUALITY_CIF, CamcorderProfile.QUALITY_QCIF, CamcorderProfile.QUALITY_LOW};
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        profiles = new int[]{CamcorderProfile.QUALITY_HIGH, CamcorderProfile.QUALITY_1080P, CamcorderProfile.QUALITY_720P, CamcorderProfile.QUALITY_480P, CamcorderProfile.QUALITY_CIF, CamcorderProfile.QUALITY_QCIF, CamcorderProfile.QUALITY_LOW};
    } else {
        profiles = new int[]{CamcorderProfile.QUALITY_HIGH, CamcorderProfile.QUALITY_LOW};
    }
    for (final int p : profiles) {
        try {
            final CamcorderProfile profile = CamcorderProfile.get(p);
            String encoder = EncoderDebugger.debug(this, profile.videoFrameWidth, profile.videoFrameHeight).getEncoderName();
            Log.d(String.valueOf(profile.videoFrameWidth + "*" + profile.videoFrameHeight), encoder);
            return profile;
        } catch (final RuntimeException re) {
            Log.e("Profile", re.getLocalizedMessage());
        }
    }
    return null;
}

EncoderDebugger

顺便说一下,QUALITY_CIF(352×288)适用于大多数设备。

0 个答案:

没有答案