gpt4 book ai didi

Android Camera onPreviewFrame帧率不一致

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:56:16 25 4
gpt4 key购买 nike

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

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

这是一个使用相机的 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);

最佳答案

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

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

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

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

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

关于Android Camera onPreviewFrame帧率不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19919793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com