写Camera这一系列之前,先把Camera主要的概况介绍下(上一篇没有写,这基本都会是一些比较简单而简短的文字记录)
参照 http://developer.android.com/reference/android/hardware/Camera.html
整个拍照的过程Docs上也有写的很清楚
1. open camera
2. get/set parameters
3. set display orientation
4. set surface
5. start preview
6. take picture
7. 拍照之后preview display会自动停止,如果还想继续拍摄就需要再次执行step 5
8. stop preview
9. release camera
这当中有些是必须的,有些不是
学习Camera最好熟悉几块重要的部分代码,这样比较容易理解,因为这是一个硬件和软件结合比较紧密的话题。
大多数时候我们只需要熟悉各个参数,然后将他们通过set parameter传递给hardware层就能完成我们需要的大部分功能。
$ANDROID_SRC_HOME/frameworks/base/core/java/android/hardware/Camera.java $ANDROID_SRC_HOME/frameworks/base/core/jni/android_hardware_Camera.cpp $ANDROID_SRC_HOME/frameworks/base/include/camera/Camera.h $ANDROID_SRC_HOME/frameworks/base/libs/camera/Camera.cpp
这几个文件已经基本可以让我们从APP的层面了解Camera了
Camera最重要的任务就是拍摄出最好的照片,APP的parameter设置下去,发现出来的片子不是我们想要的,这时就要分析是我们参数下错了,还是底层出错了。
这都是我们APP这层需要考虑的。
对于用户来说,最理想的状态就是什么都不用设置,按下拍摄,就能出来最好的片子,这就是为什么卡片机被发明出来,而且还这么受到欢迎,虽然卡片机还是无法做到什么都不设置,就能出来最佳效果的片子。
概况介绍就到这里,很简单。
下面接着说今天的主题,录影中拍摄
如今Samsung和HTC都打出边录边拍的功能,对于APP来说实现这种功能不难,只要机器的芯片支持这个功能,对于APP来说就比较简单了。
这个功能的学名叫做Video Snapshot
Android有这么一个API
/** * Returns true if video snapshot is supported. That is, applications * can call {@link #takePicture(Camera.ShutterCallback, * Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)} * during recording. Applications do not need to call {@link * #startPreview()} after taking a picture. The preview will be still * active. Other than that, taking a picture during recording is * identical to taking a picture normally. All settings and methods * related to takePicture work identically. Ex: {@link * #getPictureSize()}, {@link #getSupportedPictureSizes()}, {@link * #setJpegQuality(int)}, {@link #setRotation(int)}, and etc. The * picture will have an EXIF header. {@link #FLASH_MODE_AUTO} and {@link * #FLASH_MODE_ON} also still work, but the video will record the flash. * * Applications can set shutter callback as null to avoid the shutter * sound. It is also recommended to set raw picture and post view * callbacks to null to avoid the interrupt of preview display. * * Field-of-view of the recorded video may be different from that of the * captured pictures. * * @return true if video snapshot is supported. */ android.hardware.Camera.Parameters.isVideoSnapshotSupported()
这个API的注释把使用过程都说的很清楚,跟普通拍摄没什么两样,需要注意的就是在做Video Snapshot的时候不需要start preview就可以拍摄,因为录影的过程中,整个preview一直是活跃的。不会像普通的拍摄一样,每拍摄一次preview就会停止,需要我们再次start preview。
这项功能的关键在于厂商的芯片的好坏,比如能否在录影过程中的拍摄也支持full resolution等等。
AOSP的Camera当中就通过这行代码来实现这个功能
Log.v(TAG, "Video snapshot start"); mCameraDevice.takePicture(null, null, null, new JpegPictureCallback(loc));
更多可以参见
$ANDROID_SRC_HOME/framework/packages/apps/Camera/src/com/android/camera/VideoCamera.java
很简单不是?