【发布时间】:2017-08-22 14:54:12
【问题描述】:
我正在为我的 LG G4 开发我的相机应用程序,但我找不到以恒定帧速率录制的方法。我使用了 google 示例 Camera2 app 来添加我的功能。
当我想以 UHD 录制时:
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
if (mNextVideoAbsolutePath == null || mNextVideoAbsolutePath.isEmpty()) {
mNextVideoAbsolutePath = getVideoFilePath(getActivity());
}
mMediaRecorder.setOutputFile(mNextVideoAbsolutePath);
mMediaRecorder.setVideoEncodingBitRate(35 * 1000 * 1000);
mMediaRecorder.setVideoSize(3840, 2160);
mMediaRecorder.setVideoFrameRate(30);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
3 个不同输出视频的帧速率为 27.61、28.39、26.24 等。我无法在 30fps 的 29.97 下获得恒定的帧速率。我尝试将比特率提高到 50Mbps,将其降低到 30Mbps,但没有任何改变。
最奇怪的是,我什至无法以 1080p 录制超过 30fps 的视频:
mMediaRecorder.setVideoSize(1920, 1080);
mMediaRecorder.setVideoFrameRate(60);
我上次尝试时它以 29.69 录制了 FHD 素材,但它与 UHD 素材一样随机。我究竟做错了什么 ?
我已经检查了Recording 60fps video with Camera2(on Android version 21) API,但它也不起作用。我也找到了一些答案,但他们使用的是现在已弃用的旧相机 API(带有 Camera.Parameters)。
还有其他参数吗?
【问题讨论】:
-
文档developer.android.com/reference/android/media/… 说
setVideoFrameRate不保证恒定的帧速率。尝试使用Camera2API 而不是MediaRecorder直接录制视频可能会更幸运,但我不熟悉camera2 -
MediaRecorder是Camera2API 的一部分,不是吗?我看到的使用Camera2API 的每个示例都使用MediaRecorder。据我所知,android.hardware.camera2中没有记录方法。 C/C++ 会更好地实现恒定的 29.97 或 30 fps 吗? -
MediaRecorder和Camera2是不同的 API。前者是用于录制音频和视频媒体的更高级别的 API,后者提供接近硬件级别的相机功能,就像AudioRecorder为音频所做的那样。没错,Camera2不提供视频录制功能。我不认为还有用于录制视频的原生 API -
如果您确实需要确保恒定的帧速率,您可以配置相机(而不是媒体记录器)以恒定速率处理预览帧,以便您可以从预览帧组合视频文件。这将是一项艰巨的工作,但应该这样做。即便如此,某些设备也不能保证恒定的预览帧速率,所以要小心。我知道这可以用旧的
CameraAPI 完成,所以我相信Camera2也会允许它 -
“以恒定速率处理预览帧”您的意思是“每秒拍摄 30 张照片来组装它们”吗?处理器会很难,我也不知道如何组装图片以编程方式制作视频
标签: android frame-rate android-camera2 camera2