android - 为什么 FPS 与原始相机应用程序不同

标签 android frame-rate

我使用 Samsung Galaxy Tab 8.9 附带的原始相机应用程序(视频模式)进行了测试。保存的前置摄像头视频可以达到 24 fps,640x480。 (通过查看视频文件传输到Windows机器后的属性)

然而,当我编写前端Camera代码进行测试时。

mCamera2.setPreviewCallbackWithBuffer(new PreviewCallback() {
    public void onPreviewFrame(byte[] data, Camera camera) {
        // image processing code placed here.
    }
});

我能达到的最大结果是(不存盘,我只是测量回调函数onPreviewFrame的触发率)

  • 15 帧/秒
  • 320x240、800x600

我希望拥有与三星原装相机应用程序相同的性能。我可以知道我是否缺少某些技巧吗?

最佳答案

您看到这些结果的原因是您的回调正在获取视频样本而不是实际视频。

当摄像头将其输出转储到文件系统时,它会执行非常低级别的写入操作,将数据从摄像头的视频缓冲区复制到文件系统,而无需触及 JVM。这是保持视频高质量和低延迟所必需的,并确保最终视频流畅。如果您需要对实际视频进行​​视频处理,最好在视频录制完成后进行。

预览回调只是给你一个实际视频捕获的样本,而不是整个视频捕获——因为大多数 15fps 视频看起来仍然很流畅,预览回调只是给你一个较低分辨率、较低 fps 的预览版本被捕获的实际视频。即使是内置的三星捕获应用程序也只会显示预览版本,因为这就是所有的预览界面。

除了文件系统转储或低级字节数组数据结构(例如使用 JNI 包装器)之外,不可能从 Android 中获得准确的视频录制基准。这将很容易,但尝试直接执行此操作会阻止从相机读取输入,并且无论如何都会影响您的基准测试。

关于android - 为什么 FPS 与原始相机应用程序不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8676046/

相关文章:

android - 要为 Android Activity 设置半透明背景?

java - 保存 Google map 的部分内容

c++ - 为什么在设置 FPS 时在 SDL 中启动计时器?

android - 如何以编程方式检测口吃?

Android - 无法解析父类(super class)

android - marginLeft 似乎不适用于我的 GridLayout

android - 我的回收者 View 未在 fragment 中第二次显示

opengl - SLI 如何决定哪个 VBO 属于 OpenGL 中的哪个 GPU?

IOS AVPlayer 获取 fps

python - 在Python中更改视频帧速率(fps)