Symbian 摄像头编程预研
Supported值为3,对每种格式使用CCamera::EnumerateCaptureSizes获取得尺寸均为320*240,640*480,1152*864,这让我百思不得其解,毕竟N81是200万像素的摄像头,怎么会最大尺寸是菜1152*864呢?系统自带的照相/摄像程序也是支持1600*1200的,而且关键QQ手中邮也是支持1600*1200格式的,后来经过在论坛上搜索,才知道原来CCamera::EnumerateCaptureSizes获取的尺寸跟UI程序时横屏(landscape)还是竖屏(portrait)有关的,像N81在横屏模式下iNumImageSizesSupported的值为4,其尺寸为320*240,640*480,1152*864和1600*1200,而默认竖屏下就是之前的那些数值。
另外用E71手机做过实验,发现对于E71,横屏还是竖屏,其实是一样的,没有任何变化,其iNumImageSizesSupported始终是5,而用CCamera::EnumerateCaptureSizes获取得尺寸也均为320*240,640*480,1152*864,1600*1200和2048*1536,所以我们在获取最大尺寸时可以毫无顾忌的使用横屏模式。
有了这个尺寸,我们就可以根据需要,调用CCamera::PrepareImageCaptureL(TFormat aImageFormat,TInt aSizeIndex)函数来设定我们拍照时需要的具体尺寸了。
在这里画蛇添足下,对于使用横屏和竖屏模式切换,可以在C*AppUi内通过调用CAknAppUiBase::SetOrientationL(TAppUiOrientation aOrientation)来简单实现,具体的参数值横屏时传EappUiOrientationLandscape,竖屏时传EappUiOrientationPortrait。不过类似我们程序的自定义界面,调用完这个函数后,会产生消息到C*AppUi::HandleResourceChangeL,只要我们在这个函数内部处理好界面排版就可以了。关于该项测试,周二已经和大红一起演示过了。
视频格式和视频尺寸参数
手机摄像头自然也提供了视频的录制功能,视频是由一帧一帧的图像构成,在CameraInfo信息里头与视频相关的参数就是iNumVideoFrameSizesSupported(单帧的尺寸)、iNumVideoFrameRatesSupported(帧速)和iVideoFrameFormatsSupported(支持的帧格式)。
因为N81的iVideoFrameFormatsSupported是2048(也即0x800),所以视频格式只支持EFormatYUV420Planar一种格式,而iNumVideoFrameSizesSupported为3,即支持3种模式,通过CCamera::EnumerateVideoFrameSizes(TSize aSize,TInt aSizeIndex,TFormat aFormat)函数可以得到N81摄像时支持的三种视频尺寸为320*240,176*144,128*96,另外可以通过调用CCamera::EnumerateVideoFrameRates(TReal32 aRate, TInt aRateIndex, TFormat aFormat,TInt aSizeIndex,TExposure aExposure = EExposureAuto)函数得到N81支持的帧速为15帧每秒。
有了这些参数可以方便的通过调用CCamera::PrepareVideoCaptureL函数设置摄像时所要用到的视频尺寸和帧速;调用CCamera::StartVideoCapture函数开启摄像,开启摄像后摄像头会调用MCameraObserver::FrameBufferReady传递回来具体的每一帧数据,供界面显示和编写成视频文件;调用CCamera::StopVideoCapture函数来停止摄像,在任何时候可以通过CCamera::VideoCaptureActive来查询摄像头是否处于摄像过程中。
其它至于目前所使用的帧尺寸和帧速在其它地方是不可设置的,只能通过CCamera::GetFrameSize和CCamera::FrameRate两个函数来进行获取当前的参数值。
帧缓存参数
这个不知道怎么翻译,我就笼统称其为帧缓存参数好了,在摄像过程需要使用到帧缓存有iMaxFramesPerBufferSupported和iMaxBuffersSupported,前者表示每个buffer允许存放的最大帧数,后者为允许使用的buffer最大个数。由于N81的iMaxBuffersSupported为2,所以最多允许使用2个帧缓存区,又iMaxFramesPerBufferSupported是1,也即每个帧缓存最多只能放一帧数据。虽然目前并不完全知道其实际作用如何,但是这两个参数也是只有通过CCamera::PrepareVideoCaptureL这个函数来进行设置,通过函数CCamera::BuffersInUse()和CCamera::FramesPerBuffer()来获取当前的设置值。
由于视频摄像需要涉及到音视频编辑方面的内容,个人在视频录制方面还是空白,为此目前没有真正尝试,也就没有深入进去。
以下在贴几张预研中对E71 320万像素4倍数码变焦的CameraInfo信息截图和N81 200万像素20倍数码变焦横屏时的CameraInfo信息截图,以供大家参阅。
E71 CameraInfo信息截图
N81 横屏CameraInfo信息截图
因为E71不区分横竖屏,所以CameraInfo是一样的,有心的可以对比下之前的竖屏N81截图和横屏的差别。
此次小结先到这里,错误之处还望指正。
- 手机操作系统Symbian系介绍(05-23)
- symbian 术语表(10-10)
- Symbian 入门(09-12)
- 学习Symbian的基本概念(09-12)
- SYMBIAN 字符串操作(09-12)
- 什么是Symbian(09-12)