這里主要講述一下面向手機(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所示。
?
?