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

时间:2011-12-30 04:03:53

标签: android frame-rate

我使用原装相机应用程序(视频模式)测试了三星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.
    }
});

我可以实现的最大结果是(不将视频保存到磁盘。我只是测量onviewFrame触发率的回调函数)

  • 15 fps
  • 320x240,800x600

我希望性能与三星原装相机应用程序相同。我可以知道我错过了某种技巧吗?

3 个答案:

答案 0 :(得分:5)

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

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

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

除了文件系统转储或低级字节数组数据结构(例如使用JNI包装器)之外,在Android中获取准确的视频录制基准是不可能的。这很容易,但试图直接进行操作会阻止来自摄像头的输入读取,无论如何都会打破你的基准。

答案 1 :(得分:4)

相机FPS取决于光照条件和AutoExposure参数。在所有照明条件下获得固定帧率(来自API 14,Android 4.0):

Camera.Parameters p = camera.getParameters();
p.setPreviewFpsRange( 30000, 30000 ); // for 30 fps
if ( p.isAutoExposureLockSupported() )
     p.setAutoExposureLock( true );
camera.setParameters( p );

答案 2 :(得分:0)

也许MediaRecorder API可以与Camera API结合使用,而不是使用PreviewCallback来捕捉图像......

http://developer.android.com/guide/topics/media/camera.html#capture-video

http://developer.android.com/reference/android/media/MediaRecorder.html