gpt4 book ai didi

java - CamcorderProfile.videoCodec 返回错误值

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:14:39 25 4
gpt4 key购买 nike

根据docs , 你可以使用 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 返回的值。如果您在 INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY 模式下使用新的 android.hardware.camera2,则会出现同样的问题。

When using the Camera 2 API in LEGACY mode (i.e. when CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL is set to CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY), hasProfile(int) may return true for unsupported resolutions. To ensure a a given resolution is supported in LEGACY mode, the configuration given in CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP must contain the the resolution in the supported output sizes.

camcorder.hasProfile是测试给定质量级别的给定摄像机是否存在摄像机配置文件的方法。

所以在使用帧速率和分辨率之前,必须检查它们。

可以使用 getSupportedVideoSizes、getSupportedPreviewSizes、getSupportedPreviewFpsRange 方法检索支持的值

getSupportedVideoSizes 获取可由 MediaRecorder 使用的受支持的视频帧大小。

如果返回的列表不为空,则返回的列表将至少包含一个大小,如果使用相机作为视频源,则返回列表中的其中一个大小必须传递给摄像机应用程序的 MediaRecorder.setVideoSize()。在这种情况下,预览的大小可能与录制视频时录制的视频的分辨率不同。

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

关于java - CamcorderProfile.videoCodec 返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56342378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com