首页 > 解决方案 > 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);

标签: javaandroidandroid-cameraandroid-mediarecorder

解决方案


它看起来与在 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() 用于摄像机应用程序。在这种情况下,预览的大小可能与视频录制期间录制的视频的分辨率不同。

因此,也许我们应该检查视频大小,如果它是空的,则将预览大小锁定为等于录制大小。


推荐阅读