9

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

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

下面是一个使用 Camera 的 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);
4

1 回答 1

17

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

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

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

其次,如果onPreviewFrame()到达主(UI)线程,您会导致任何 UI 动作直接延迟相机帧的到达。要保持onPreviewFrame()在单独的线程上,您应该open()将相机放在辅助 Looper 线程上。在这里,我详细解释了如何实现这一点:HandlerThread 优于其他类似类的最佳使用

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

于 2013-11-12T08:10:04.177 回答