尝试在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.
提前谢谢..
答案 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字节大小的数据结构,用于保存在相机缓冲区列表中的实际(?)帧缓冲区。
所以,这个主题还没有完成。 :)