java - CamcorderProfile.videoCodec 返回错误值
问题描述
根据文档,您可以使用CamcorderProfile
获取设备默认视频编解码器格式,然后将其设置为MediaRecorder
,如下所示:
CamcorderProfile mProfile = CamcorderProfile.get(cameraId, CamcorderProfile.QUALITY_HIGH);
//
mMediaRecorder.setVideoEncoder(mProfile.videoCodec);
但由于某种原因,它返回了错误的格式。
我正在使用CameraView库,并且在FullVideoRecorder类中定义了以下内容:
switch (mResult.getVideoCodec()) {
case H_263: mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); break;
case H_264: mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); break;
case DEVICE_DEFAULT: mMediaRecorder.setVideoEncoder(mProfile.videoCodec); break;
}
当我将视频编码器设置为时,我遇到问题的设备运行良好H_263
,但由于某种原因,当我将其设置为默认时,它会崩溃 - 在这种情况下,默认意味着CamcorderProfile
应该选择设备的默认视频编解码器格式。
我的问题:
有什么理由CamcorderProfile.videoCodec
会返回错误的值,如何解决?
编辑- 添加更多信息
我实施了以下操作以确保是否CamcoderProfile
返回错误的值:
//In onCreate
CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
//getVideoCodec method below
String profileCodec = getVideoCodec(camcorderProfile.videoCodec);
//Log the result I get
Log.e("Video Codec =", profileCodec);
private String getVideoCodec(int videoCodec){
switch(videoCodec){
case MediaRecorder.VideoEncoder.H263:
return "H263";
case MediaRecorder.VideoEncoder.H264:
return "H264";
case MediaRecorder.VideoEncoder.MPEG_4_SP:
return "MPEG_4_SP";
case MediaRecorder.VideoEncoder.DEFAULT:
return "DEFAULT";
default:
return "unknown";
}
}
在我的日志中,我得到了Video Codec = H264
,但这是不正确的,它应该返回Video Codec = H263
。
如果我将以下内容传递给MediaRecorder
,它会完美运行:
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
但不是当我设置以下任何一项时:
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
mMediaRecorder.setVideoEncoder(mProfile.videoCodec);
解决方案
它看起来与在 CameraView 库 https://github.com/natario1/CameraView/issues/467上发现的问题有关
根据 Android 文档,如果使用旧的 android.hardware.camera,则您不能信任视频配置文件 API 返回的值。如果您将新的 android.hardware.camera2 与 INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY 模式一起使用,也会出现同样的问题。
在 LEGACY 模式下使用 Camera 2 API 时(即当 CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL 设置为 CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY 时),对于不支持的分辨率,hasProfile(int) 可能会返回 true。为确保在 LEGACY 模式下支持给定分辨率,CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP 中给出的配置必须包含支持的输出大小中的分辨率。
camcorder.hasProfile是用于测试给定质量级别的给定摄像机是否存在摄像机配置文件的方法。
因此,在使用帧速率和分辨率之前,必须对其进行检查。
可以使用 getSupportedVideoSizes、getSupportedPreviewSizes、getSupportedPreviewFpsRange 方法检索支持的值
getSupportedVideoSizes 获取 MediaRecorder 可以使用的支持的视频帧大小。
如果返回的列表不为空,则返回的列表将包含至少一个 Size,并且如果使用相机作为视频源,则返回列表中的其中一个尺寸必须传递给 MediaRecorder.setVideoSize() 用于摄像机应用程序。在这种情况下,预览的大小可能与视频录制期间录制的视频的分辨率不同。
因此,也许我们应该检查视频大小,如果它是空的,则将预览大小锁定为等于录制大小。
推荐阅读
- python - 如何通过Python中MCU发送的串口读取字节
- json - 在 JOLT 中将数组值映射到 JSON
- android - 更改设备方向后如何保存 ArrayList 数据并在 AutoCompleteTextView 中使用
- python - 蓝牙 - 在 linux 中检查 rssi
- redis - 将 Redis DEL 转换为 UNLINK 命令
- c - 尝试将字符串直接传递给函数时会导致分段错误
- angular - 使用 forkJoin 运行嵌套的 http 请求
- html - 应用了哪个 CSS 属性?
- scala - 为什么 cat 的效果异步签名使用 Either[Throwable, A] 而不是 Try[A]?
- android - 从 secp256r1 曲线中获取 x 和 y