Cla*_*ssA 11 java android android-camera android-mediarecorder
根据docs,您可以CamcorderProfile用来获取设备的默认视频编解码器格式,然后将其设置为MediaRecorder,如下所示:
CamcorderProfile mProfile = CamcorderProfile.get(cameraId, CamcorderProfile.QUALITY_HIGH);
//
mMediaRecorder.setVideoEncoder(mProfile.videoCodec);
Run Code Online (Sandbox Code Playgroud)
但是由于某种原因,它返回了错误的格式。
我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
当我将视频编码器设置为时,遇到问题的设备可以很好地工作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";
}
}
Run Code Online (Sandbox Code Playgroud)
在我的日志中,我得到了Video Codec = H264,但这是不正确的,它应该返回Video Codec = H263。
如果我将以下内容传递给MediaRecorder,则效果很好:
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
Run Code Online (Sandbox Code Playgroud)
但当我设置以下任何一项时,则不会:
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
mMediaRecorder.setVideoEncoder(mProfile.videoCodec);
Run Code Online (Sandbox Code Playgroud)
它看起来与 CameraView 库上发现的问题有关 https://github.com/natario1/CameraView/issues/467
根据 Android 文档,如果使用旧的 android.hardware.camera,那么您不能信任视频配置文件 API 返回的值。如果您在 INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY 模式下使用新的 android.hardware.camera2,也会出现同样的问题。
在 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() 。在这种情况下,视频录制期间预览的尺寸可能与录制视频的分辨率不同。
因此,也许我们应该检查视频大小,如果它为空,则将预览大小锁定为等于录制大小。