当前位置: 首页 > 知识库问答 >
问题:

Android Camera onPreviewFrame帧速率不一致

傅泉
2023-03-14

我试图通过相机的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

                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);

共有1个答案

蓬祺
2023-03-14

不,Android摄像头不能保证稳定的帧速率,尤其是在每秒30帧的情况下。例如,它可以在低照明条件下选择更长的曝光时间。

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

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

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

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

 类似资料:
  • 我一直在看几个帖子(http://tinyurl.com/nqtfh9a...)和PPS的链接(http://www.cardinalpeak.com/blog/the-h-264-sequence-parameter-set/),但不能真正理解这个概念。 我买了一个带有SDK的编码器。在规格中,它给了我SPS和PPS,我想知道这里是否有帧速率信息: 我试着从这些信息中获得SPS,但我无法获得相同

  • 问题内容: 我将其发布为相关主题下的评论。但是,它们似乎没有引起注意== 我用过 分成存储为文件的帧。似乎行得通,只是不太行。录制视频时,我的录制速率为,而视频却很长。如果我的数学正确,则整个视频总共应为 149,000帧 。可是我跑的时候 我只获得了4472个文件。如何获得原始的149k帧? 我还尝试通过执行以下操作将原始AVI的帧频转换为1000fps 但这似乎并没有解决我的问题。 问题答案:

  • 我正在尝试提取几个视频上的所有帧。这些视频是在以可变帧速率保存输出的摄像机上拍摄的,因此,一些帧在时间上比其他帧更接近(根据mediainfo,每秒27到30帧) 这些帧将与一些元数据同步,因此我不仅需要提取它们,还需要保留视频每帧拍摄的[相对]时间信息。 我一直在使用ffmpeg来提取视频帧,当视频帧速率不再恒定时,挑战就来了。任何其他不同于ffmpeg的方法或程序都可以完成任务。

  • 因此,在回答我的问题(如何连续移动图像平滑Pyplay?)我被告知设置我的帧率,以便做我的动画。但是不管我把它放在哪里,什么都不做。我做BTW。那么我该怎么做呢?我已经研究并发现了这一点(pyplayclock.tick()vs在游戏主循环中的帧率),但我并不真正理解这一点。 我的主要游戏功能; 这是我的主要游戏循环; 主游戏循环不会设置帧速率,因为主游戏函数中有一个循环。这只是一个循环,因为当我

  • 我得到了一个错误,我完全不知道如何去修复它。环顾stackoverflow,这个错误似乎与损坏的文件或在不兼容的Java版本中编译的类有关。这是我一直在研究的问题之一:获得java.lang.VerifyError的原因 为了消除这类错误,我清理了项目好几次,删除了我找到的每个.class文件。将所有的依赖项(JAR)更新到最新版本,对于比较模糊的JAR,我找不到新的版本,因为我跟踪了源代码,并将

  • 就像pygame一样,我想限制循环的帧速率。Pygame提供Pygame。时间时钟勾选()方法: 如果您传递可选的framerate参数,函数将延迟以使游戏运行速度低于给定的每秒滴答数。这可以用来帮助限制游戏的运行速度。通过呼叫时钟。每帧勾选(40)一次,程序的运行速度不会超过每秒40帧。 但是如何在python中以本机方式实现呢? 举例说明: 制作: 我希望每秒25帧,所以