這里主要講述一下面向手機中照相機的應(yīng)用開發(fā)。ICamera能夠使應(yīng)用訪問手機中的照相機傳感器,配置照相機的快照和錄像模式,并提供多種的記錄和編碼的方式(圖14-9)。
圖14-9:ICamera的體系結(jié)構(gòu)
?
使用ICamera 的應(yīng)用可以實現(xiàn)取景,以類似JPEG格式編碼和存儲相片,以類似MPEG4格式編碼和存儲錄像,對照相機的對比度,縮放,聚焦,白平衡等屬性進行設(shè)定,監(jiān)聽并處理與照相機相關(guān)的各種異步事件得等,其狀態(tài)機示意圖如14-10所示。
圖14-10:ICamera的狀態(tài)機
使用ICamera時,首先通過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);
就編碼方式而言,照相時可以指定JPEG方式,錄像時可以指定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接口對象由READY轉(zhuǎn)換成PREVIEW狀態(tài)
?
{CAM_CMD_START, CAM_MODE_PREVIEW,
CAM_STATUS_FRAME}
?ICAMERA_GetFrame()可以獲得當前的這幀圖像
?
{CAM_CMD_START, CAM_MODE_PREVIEW,
CAM_STATUS_DONE}
?取景結(jié)束,ICamera接口對象從PREVIEW轉(zhuǎn)換成狀態(tài)READY
?
{CAM_CMD_START, CAM_MODE_PREVIEW,
CAM_STATUS_ABORT, CAM_EXXX_}
?取景時異常退出
?
表 14-3:照相機取景模式中的事件
ICamera接口對象在取景時的狀態(tài)轉(zhuǎn)移時序如圖14-11所示。
圖14-11:ICamera取景時的狀態(tài)轉(zhuǎn)移時序
?
下面是在使用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;
}
}
如果希望完成一個照相的操作,首先要設(shè)定照片的存儲位置,然后執(zhí)行照相操作即可。
ICAMERA_SetMediaData(pme->m_pICamera, &md);
ICAMERA_RecordSnapshot(pme->m_pICamera);
原始圖像是以JPEG格式保存的,ICamera接口對象照相時的狀態(tài)轉(zhuǎn)移時序如圖14-12所示。
?
圖14-12:ICamera執(zhí)行照相操作的狀態(tài)轉(zhuǎn)移時序
在錄像的時候,ICamera 接口對象會捕獲原始的圖像幀和相關(guān)的音頻數(shù)據(jù),然后發(fā)送幀的相關(guān)事件給BREW應(yīng)用,同時對幀和音頻數(shù)據(jù)以MPEG4/AAC的格式進行編碼。使用時,同樣先要指定錄像的存儲位置,然后執(zhí)行錄像操作,錄像完畢時終止錄像操作。
ICAMERA_SetMediaData(pme->m_pICamera, &md);
ICAMERA_RecordMovie(pme->m_pICamera);
ICAMERA_Stop(pme->m_pICamera);
ICamera接口對象錄像時的狀態(tài)轉(zhuǎn)移時序如圖14-13所示。
?
?