【问题标题】:Android Camera onPreviewFrame frame rate not consistentAndroid Camera onPreviewFrame 帧率不一致
【发布时间】:2013-11-24 01:09:12
【问题描述】:

我正在尝试通过相机的 PreviewCall back(onPreviewFrame) 使用 MediaCodec 对每秒 30 帧的视频进行编码。我编码的视频总是播放得很快(这是不希望的)。 因此,我尝试通过设置一个 int frameCount 变量来记住它的计数来检查进入我的相机预览的帧数。我期望的是每秒 30 帧,因为我将相机的预览设置为 30 fps 预览(如下所示)。我回来的结果不一样。 我调用了 onPreviewFrame 回调 10 秒,我得到的 frameCount 数只有 100 帧左右。这很糟糕,因为我期待 300 帧。我的相机参数设置正确吗?这是Android相机预览回调的限制吗?如果这是对Android Camera的预览回调的限制,那么还有没有其他的camera回调可以以每秒30帧的速度返回camera的图像数据(nv21,yuv,yv12)?

感谢您阅读并花时间提供帮助。我将不胜感激任何 cmets 和意见。

这是一个使用相机的 onPreviewFrame 编码的视频示例:

http://www.youtube.com/watch?v=I1Eg2bvrHLM&feature=youtu.be

                Camera.Parameters parameters = mCamera.getParameters();
                parameters.setPreviewFormat(ImageFormat.NV21);
                parameters.setPictureSize(previewWidth,previewHeight);
                parameters.setPreviewSize(previewWidth, previewHeight);
//              parameters.setPreviewFpsRange(30000,30000);

                parameters.setPreviewFrameRate(30);
                mCamera.setParameters(parameters);

                mCamera.setPreviewCallback(previewCallback);
                mCamera.setPreviewDisplay(holder);

【问题讨论】:

  • 不同的设备有不同的功能。 30fps 是否在 developer.android.com/reference/android/hardware/… 返回的范围内?
  • 我的设备返回了 5000-30000 的范围,我想我现在的问题是如何固定速率以使其不会一直变化?
  • 除了camera onPreviewFrame回调还有其他方法可以获取camera frame数据吗?
  • 您可以像 OpenCV 一样使用本机摄像头接口,而不是 onPreviewFrame(),但它并不更可靠、速度不快且不受官方支持。它不会克服可变范围问题。如果你可以使用硬件编码器,我只推荐这种方式用于视频录制,它可以读取内核地址空间中的相机缓冲区。

标签: android android-camera android-mediacodec


【解决方案1】:

不,Android 相机不保证稳定的帧速率,尤其是在 30 FPS 时。例如,它可能会在低光照条件下选择更长的曝光时间。

但是,作为应用开发者,我们有一些方法可以让事情变得更糟。

首先,使用setPreviewCallback() 代替setPreviewCallbackWithBuffer()。这可能会对垃圾收集器造成不必要的压力。

其次,如果onPreviewFrame() 到达主(UI)线程,您会导致任何UI 操作直接延迟相机帧的到达。要将onPreviewFrame() 保留在单独的线程上,您应该将open() 相机放在辅助Looper 线程上。这里我详细解释了如何实现这一点:Best use of HandlerThread over other similar classes

第三,检查处理时间是否小于20ms。

【讨论】:

  • 感谢亚历克斯,您的建议显着提高了帧率回调。无论如何,它仍然无法修复回拨率。我需要回拨率准确地说是 25fps 或 30fps...不多也不少
  • 可能值得用 systrace 检查应用程序,看看痛点在哪里。
猜你喜欢
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 2015-12-25
  • 2021-12-23
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多