读AOSP的Camera源码之录影中拍摄

写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

很简单不是?

Leave a Reply

Your email address will not be published. Required fields are marked *