Android相机原生访问:startPreview()vs startRecording()

时间:2014-02-17 10:22:22

标签: android android-ndk camera

尝试在Android ICS中使用本机代码运行相机: 大多数手册都是指 startPreview()方法。但是浏览AOSP代码我在<Camera.h>中找到了' startRecording()'方法。 Here表示它来自接口ICameraRecordingProxy “允许录音机在录制期间接收视频帧

所以问题是 - 在性能方面是'startRecording'方法比'startPreview'更有效吗?

进入本机代码的唯一目标是性能,Java“Camera”太慢,而OpenCV也没有提供所需的FPS级别。

编辑:目标平台是:API级别= 17,设备Allwinner A31开发板,1280x720x30FPS。 任务是从相机捕获帧,修改它们,编码(H264)并存储到SD卡。 纯java MediaRecorder使用1280x720x30写入mp4文件。不需要在屏幕上显示实时预览。

纯模式下的OpenCV-demo1给出1920x1080x2(在java模式下相同)。具有空PreviewCallback最大FPS的简单Java方法是15.

提前谢谢..

3 个答案:

答案 0 :(得分:1)

在性能方面,本机相机没有任何好处。在Java中使用Camera.setPreviewCallbackWithBuffer()off UI thread)可以提供与每个本机替代方案一样多的帧数。但在某些SOC上,例如三星,相机输出可以直接(0-copy)与HW h264编码器连接,这自然可以提供出色的吞吐量。这就是&lt; quote&gt; 纯java MediaRecorder &lt; / quote&gt;引擎盖下。如果涉及缓冲区的任何操作,则无法实现相同的效果。

答案 1 :(得分:1)

关闭主题: 使用本机访问相机并使用硬件H264编码器,我能够达到1280x720,FPS = 30。也可以在飞行中修改(水印)数据,保持FPS高。 没有其他方法 - 任何JAVA或OpenCV都可以提供超过15 FPS(可能我没有努力......)

startRecording()完美无缺

感谢您的评论

答案 2 :(得分:0)

dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& data) 

何时

msgType==CAMERA_MSG_VIDEO_FRAME

以内部形式提供数据。它不能保证纯yuv帧数据。例如,data.get()->size()可以大于yuv帧大小,或者可以是一些20字节大小的数据结构,用于保存在相机缓冲区列表中的实际(?)帧缓冲区。

所以,这个主题还没有完成。 :)