【问题标题】:camera2's setVideoFramerate() doesn't have any effectcamera2 的 setVideoFramerate() 没有任何效果
【发布时间】: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 不保证恒定的帧速率。尝试使用Camera2 API 而不是MediaRecorder 直接录制视频可能会更幸运,但我不熟悉camera2
  • MediaRecorderCamera2 API 的一部分,不是吗?我看到的使用Camera2 API 的每个示例都使用MediaRecorder。据我所知,android.hardware.camera2中没有记录方法。 C/C++ 会更好地实现恒定的 29.97 或 30 fps 吗?
  • MediaRecorderCamera2 是不同的 API。前者是用于录制音频和视频媒体的更高级别的 API,后者提供接近硬件级别的相机功能,就像 AudioRecorder 为音频所做的那样。没错,Camera2 不提供视频录制功能。我不认为还有用于录制视频的原生 API
  • 如果您确实需要确保恒定的帧速率,您可以配置相机(而不是媒体记录器)以恒定速率处理预览帧,以便您可以从预览帧组合视频文件。这将是一项艰巨的工作,但应该这样做。即便如此,某些设备也不能保证恒定的预览帧速率,所以要小心。我知道这可以用旧的Camera API 完成,所以我相信Camera2 也会允许它
  • “以恒定速率处理预览帧”您的意思是“每秒拍摄 30 张照片来组装它们”吗?处理器会很难,我也不知道如何组装图片以编程方式制作视频

标签: android frame-rate android-camera2 camera2


【解决方案1】:

注意:在某些具有自动帧速率的设备上,这会设置最大帧速率,而不是恒定帧速率。实际帧率会因光照条件而异。

试试这个:

mediaRecorder.setCaptureRate(30);

【讨论】:

  • 这是作为答案发布的,但它不会尝试回答问题。它可能应该是评论或完全删除。
猜你喜欢
  • 2018-06-14
  • 2019-06-19
  • 2017-07-18
  • 2010-10-17
  • 2012-11-25
  • 2013-10-10
  • 2016-08-26
  • 2021-12-15
  • 2013-10-17
相关资源
最近更新 更多