我测试了原装相机应用程序(视频模式)附带三星Galaxy Tab 8.9.保存的前置摄像头视频能够达到24 fps,640×480. (通过在转移到
Windows机器后查看视频文件的属性)
但是,当我写前置Camera代码进行测试时.
mCamera2.setPreviewCallbackWithBuffer(new PreviewCallback() { public void onPreviewFrame(byte[] data,Camera camera) { // image processing code placed here. } });
我可以实现的最大结果是(没有将视频保存到磁盘.我只是测量onviewFrame触发率的回调函数)
> 15 fps
> 320×240,800×600
我希望性能与三星原装相机应用程序相同.我可以知道我错过了某种技巧吗?
解决方法
您看到这些结果的原因是您的回调是获取视频的样本而不是实际视频.
当摄像机将其输出转储到文件系统时,它正在进行非常低级别的写入操作,将数据从摄像机的视频缓冲区复制到文件系统,而不会触及JVM.这是保持视频高质量和低延迟所必需的,并确保平滑的最终视频.如果您需要对实际视频进行视频处理,最好在视频录制完成后再进行.
预览回调仅仅是为您提供实际视频捕获的样本,而不是整个视频捕获 – 因为大多数15fps视频仍然看起来流畅,预览回调只会给您一个较低分辨率,较低fps预览版本的实际视频被捕获.即使是内置的三星捕获应用程序也只会显示预览版本,因为这是所有的预览界面.
除了文件系统转储或低级字节数组数据结构(例如使用JNI包装器)之外,在Android中获取准确的视频录制基准是不可能的.这很容易,但尝试直接进行操作会阻止来自摄像头的输入读取,无论如何都会打破你的基准测试.