把采集到的数据保存到 SD 卡中,然后从中读取出来,回放视频录像,分辨率为 320*240
OV9650 驱动中有一个功能,可以获得最新 1 帧的 RGB 图像的数据信息,如果把一张张图片回放,就成视频了
一、视频存储:把视频文件放在 SD 中的文件
1、 在 SD 卡中创建文件
CString filename = "1.txt";
// 取得文件名及路径
filename = _T("//Storage Card//") + filename;
// 创建一个文件或打开一个文件
hFile = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, 0,
NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
MessageBox(_T(" 在 SD/MMC 卡上创建文件失败 !"));
return 0;
}
MessageBox(_T(" 成功创建 / 打开文件 :") + filename);
2、 把图像信息存放在文件中
// 录像
void COV9650Dlg::Onluxiang()
{
// TODO: Add your control notification handler code here
PINGPONG_PR image;
WORD width=GetSystemMetrics(SM_CXSCREEN);
WORD height=GetSystemMetrics(SM_CYSCREEN);
BYTE* DDBdata=new BYTE[width*height*2];
DWORD actlen;
if (hFile == INVALID_HANDLE_VALUE)
{
MessageBox(_T(" 文件未打开 !"));
return;
}
BOOL ret = SetFilePointer(hFile, 0, NULL, FILE_END); // 移动文件指针到文件末尾
if (ret == 0xFFFFFFFF)
{
MessageBox(_T(" 将文件指针移至文件结尾失败 !"));
return;
}
for(DWORD i=0;i<60;i++)
{
ret=DeviceIoControl(m_hled,CAM_IOCTL_SAMSUNG_CAM_PR,NULL,NULL,(PBYTE)&image,NULL,NULL,NULL);// 获得最新 1 帧的 RGB 图像
if(!ret)
AfxMessageBox(_T(" 读取图片失败 !"));
else
{
SetKMode(TRUE);
memcpy(DDBdata,(void *)image.rgb_address,width*height*2);
SetKMode(FALSE);
ret = WriteFile(hFile, DDBdata, width*height*2, &actlen, NULL);// 将数据写入文件中
if (!ret)
MessageBox(_T(" 写文件失败 !"));
Sleep(300);
}
}
AfxMessageBox(_T(" 录像完成 !"));
delete []DDBdata;
}
二、视频回放
1 、驱动
在 CIS_IOControl() 函数中添加
case CAM_IOCTL_luxiang :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:CAM_IOCTL_luxiang/r/n")));
Display_Cam_Image1(sDISINFO.pos_x,sDISINFO.pos_y,sDISINFO.dis_x, sDISINFO.dis_y, pBufIn);// 刷新显示
break;
// 刷新显示 buffer 是图片信息的指针
void Display_Cam_Image1(U32 pos_x, U32 pos_y, U32 size_x, U32 size_y, U8 *buffer)
{
U32 y;
for (y=0; y<size_y; y++)
{
memcpy((void*)(IMAGE_FRAMEBUFFER_UA_BASE+(FEILING_LCD_XSIZE*pos_y* 2 + pos_x*2) + y*FEILING_LCD_XSIZE*2),(void *)buffer,(size_x)*2);
buffer += (sCAMINFO.pre_x*2);
}
}
3、 应用程序
// 回放录像
void COV9650Dlg::Onchakan()
{
// TODO: Add your control notification handler code here
DWORD filelen,actlen;
BYTE *pcharbuff;
if (hFile == INVALID_HANDLE_VALUE)
{
MessageBox(_T(" 文件未打开 !"));
return;
}
filelen = GetFileSize(hFile, NULL);// 获取文件大小
if (filelen == 0xFFFFFFFF)
{
MessageBox(_T(" 获取文件大小失败 !"));
return;
}
BOOL ret = SetFilePointer(hFile, 0, NULL, FILE_BEGIN);// 移动文件指针到文件开头
if (ret == 0xFFFFFFFF)
{
MessageBox(_T(" 将文件指针移至文件开头失败 !"));
return;
}
pcharbuff = new BYTE[320*240*2];
filelen=filelen/(320*240*2);
for(DWORD i=0;i<filelen;i++)
{
ret = ReadFile(hFile, pcharbuff, 320*240*2, &actlen, NULL); // 从文件中读出数据
if(!ret)
MessageBox(_T(" 读文件失败 !"));
ret=DeviceIoControl(m_hled,CAM_IOCTL_luxiang,pcharbuff,NULL,NULL,NULL,NULL,NULL);// 回放录像
if(!ret)
AfxMessageBox(_T(" 读取图片失败 !"));
Sleep(300);
}
//MessageBox(_T(" 回放完成 !"));
if (pcharbuff != NULL)
delete[] pcharbuff;
}