我正在尝试在设备之间传输视频。我想尽可能支持旧设备。所以我从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;
}
顺便说一下,QUALITY_CIF
(352×288)适用于大多数设备。