- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
根据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/
根据docs , 你可以使用 CamcorderProfile 获取设备默认的视频编解码器格式,然后将其设置为 MediaRecorder,如下所示: CamcorderProfile mProfil
我正在使用 Accord.Video.ffmpeg 在 c# 中录制视频。它实际上是一个深度视频,像素表示深度大小。从深度数组我创建一个位图并使用 WriteVideoFrame 方法保存位图。 之后
我目前正在开发一个Android VoIP 应用程序,为了支持 VoIP,我正在使用一个开源库 Linphone。 目前正在进行语音通话,但没有进行视频通话。分析了一会儿,我知道应用加载时默认情况下,
我是一名优秀的程序员,十分优秀!