這里主要講述一下面向手機(jī)中照相機(jī)的應(yīng)用開發(fā)。ICamera能夠使應(yīng)用訪問手機(jī)中的照相機(jī)傳感器,配置照相機(jī)的快照和錄像模式,并提供多種的記錄和編碼的方式(圖14-9)。

圖14-9:ICamera的體系結(jié)構(gòu)

?

使用ICamera 的應(yīng)用可以實(shí)現(xiàn)取景,以類似JPEG格式編碼和存儲(chǔ)相片,以類似MPEG4格式編碼和存儲(chǔ)錄像,對(duì)照相機(jī)的對(duì)比度,縮放,聚焦,白平衡等屬性進(jìn)行設(shè)定,監(jiān)聽并處理與照相機(jī)相關(guān)的各種異步事件得等,其狀態(tài)機(jī)示意圖如14-10所示。

圖14-10:ICamera的狀態(tài)機(jī)

使用ICamera時(shí),首先通過AEECLSID_CAMERA創(chuàng)建接口:

ISHELL_CreateInstance(pme->a.m_pIShell,AEECLSID_CAMERA,(void **)&pme->m_pICamera);

然后注冊回調(diào)函數(shù)來接收Camera的事件,

ICAMERA_RegisterNotify(pme->pICamera, CApp_CameraNotify,pme);

接下來,設(shè)定取景模式和顯示區(qū)域:

ICAMERA_SetParm(pme->pICamera, CAM_PARM_PREVIEW_TYPE,CAM_PREVIEW_SNAPSHOT, 0);

ICAMERA_SetDisplaySize(pme->m_pICamera, &pme->m_sizeDisplay);

ICAMERA_SetSize(pme->m_pICamera, &pme->m_sizeFrame);

就編碼方式而言,照相時(shí)可以指定JPEG方式,錄像時(shí)可以指定MPEG4和AAC的音頻編碼

ICAMERA_SetVideoEncode(pme->m_pICamera,AEECLSID_JPEG, 0);

ICAMERA_SetVideoEncode(pme->m_pICamera,AEECLSID_MPEG4, 0);

ICAMERA_SetAudioEncode(pme->m_pICamera,AEECLSID_AAC, 0);

開始和停止取景可以調(diào)用ICAMERA_Preview()和ICamera_Stop()完成,照相和錄像的中的異步事件主要包含在數(shù)據(jù)結(jié)構(gòu)AEECameraNotify中:

?? typedef struct AEECameraNotify

?? {

????? ICamera *????? pCam;

????? int16????????? nCmd;

????? int16????????? nSubCmd;

????? int16????????? nStatus;

????? int16????????? nReserved;

????? void *???????? pData;

????? uint32???????? dwSize;

?? } AEECameraNotify;

其中nStatus定義了類似CAM_STATUS_XXX的狀態(tài)代碼,nCmd 定義了指令代碼(例如 CAM_CMD_START),nSubCmd 包含了子指令的代碼(例如CAM_CMD_START, 子指令的代碼包含了類似CAM_MODE_XXX等模式信息),pData 包含了與事件相關(guān)的數(shù)據(jù),dwSize 是指這些數(shù)據(jù)的長度。 表14-3介紹了一些與取景相關(guān)的事件解釋。

事件組合

?事件解釋

?

{CAM_CMD_START, CAM_MODE_PREVIEW,CAM_STATUS_START}

?開始取景,ICamera接口對(duì)象由READY轉(zhuǎn)換成PREVIEW狀態(tài)

?

{CAM_CMD_START, CAM_MODE_PREVIEW,

CAM_STATUS_FRAME}

?ICAMERA_GetFrame()可以獲得當(dāng)前的這幀圖像

?

{CAM_CMD_START, CAM_MODE_PREVIEW,

CAM_STATUS_DONE}

?取景結(jié)束,ICamera接口對(duì)象從PREVIEW轉(zhuǎn)換成狀態(tài)READY

?

{CAM_CMD_START, CAM_MODE_PREVIEW,

CAM_STATUS_ABORT, CAM_EXXX_}

?取景時(shí)異常退出

?

表 14-3:照相機(jī)取景模式中的事件

ICamera接口對(duì)象在取景時(shí)的狀態(tài)轉(zhuǎn)移時(shí)序如圖14-11所示。

圖14-11:ICamera取景時(shí)的狀態(tài)轉(zhuǎn)移時(shí)序

?

下面是在使用ICamera的錄像模式中處理幀事件的示例:

static void MyApp_CameraNotify(MyApp *pme, AEECameraNotify * pn){

switch (pn->nStatus){

case CAM_STATUS_START:

// Preview has begun...

break;

case CAM_STATUS_FRAME:

{

IBitmap * pFrame;

AEEBitmapInfo bi;

// Get the frame.

ICAMERA_GetFrame(pme->m_pICamera, &pFrame));

// Get the bitmap info.

IBITMAP_GetInfo(pFrame, &bi, sizeof(bi));

// Display the frame at (0, 0) location of the screen

IDISPLAY_BitBlt(pme, 0, 0, bi.cx, bi.cy, pFrame, 0, 0, AEE_RO_COPY);

IBITMAP_Release(pFrame);

break;

}

case CAM_STATUS_DONE:

// ICAMERA_Stop() stopprf preview operation stopped.

break;

case CAM_STATUS_ABORT:

// Preview got aborted.

break;

}

}

如果希望完成一個(gè)照相的操作,首先要設(shè)定照片的存儲(chǔ)位置,然后執(zhí)行照相操作即可。

ICAMERA_SetMediaData(pme->m_pICamera, &md);

ICAMERA_RecordSnapshot(pme->m_pICamera);

原始圖像是以JPEG格式保存的,ICamera接口對(duì)象照相時(shí)的狀態(tài)轉(zhuǎn)移時(shí)序如圖14-12所示。

?

圖14-12:ICamera執(zhí)行照相操作的狀態(tài)轉(zhuǎn)移時(shí)序

在錄像的時(shí)候,ICamera 接口對(duì)象會(huì)捕獲原始的圖像幀和相關(guān)的音頻數(shù)據(jù),然后發(fā)送幀的相關(guān)事件給BREW應(yīng)用,同時(shí)對(duì)幀和音頻數(shù)據(jù)以MPEG4/AAC的格式進(jìn)行編碼。使用時(shí),同樣先要指定錄像的存儲(chǔ)位置,然后執(zhí)行錄像操作,錄像完畢時(shí)終止錄像操作。

ICAMERA_SetMediaData(pme->m_pICamera, &md);

ICAMERA_RecordMovie(pme->m_pICamera);

ICAMERA_Stop(pme->m_pICamera);

ICamera接口對(duì)象錄像時(shí)的狀態(tài)轉(zhuǎn)移時(shí)序如圖14-13所示。

?

?