OV9650视频录像存储、回放

把采集到的数据保存到 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;

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值