CubieBoard博客-HomeCubieTech公司网站

cubie.cc CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 4799|回复: 4

Cubieboard2 V4l2 采集保存成yuv文件播放绿屏

[复制链接]

1

主题

0

好友

313

积分

中级会员

Rank: 3Rank: 3

贡献
67
金钱
103
威望
67
买家信用
卖家信用
积分
313
发表于 2015-6-24 15:57:38 |显示全部楼层
本帖最后由 Linux- 于 2015-6-24 16:50 编辑

    各位,大神。最近在做V4l2采集视频, 使用的摄像头是ov7670. Cubieboard2+DVK521拓展板子。使用发行版是: cb2 debian server

  使用这里程序已经能通过V4l2 采集视频显示到VGA上面:
http://dl.cubieboard.org/parteners/waveshare/Source_Code/a20-cubieboard-dvk/Driver%20and%20API/API/camera_test_vga/

接下来想通过修改上面连接的代码,把采集到视频保存到一个 文件test.yuv. 程序已经改好, 修改记录如下, 详细代码文件字数限制了上传到附件,见附件:

在ubuntu 12.04 使用ffplay播放:
$ffplay -f rawvideo -video_size 320*240 test.yuv

播放绿屏


修改记录
  1. diff --git a/test_camera.c b/test_camera.c
  2. index 63e13e6..363cc6b 100644
  3. --- a/test_camera.c
  4. +++ b/test_camera.c
  5. @@ -48,12 +48,12 @@
  6. #include "include/video/sunxi_disp_ioctl.h"//modify this

  7. //#define READ_NUM 5000
  8. -#define DISPLAY
  9. #define LCD_WIDTH                1024
  10. #define LCD_HEIGHT            768

  11. #define CLEAR(x) memset (&(x), 0, sizeof (x))

  12. +char *filename = "test.yuv\0";  
  13. int count;

  14. struct buffer {
  15. @@ -71,7 +71,7 @@ static int              fd              = -1;
  16. struct buffer *         buffers         = NULL;
  17. static unsigned int     n_buffers       = 0;

  18. -FILE *file_fd;
  19. +FILE *fp;
  20. static unsigned long file_length;
  21. static unsigned char *file_name;

  22. @@ -381,6 +381,9 @@ enum v4l2_ctrl_type qc_ctrl[]=
  23.          (V4L2_CID_BASE+31)
  24. };

  25. +static void process_image(const void * p, int size) {  
  26. +    fwrite(p, size, 1, fp);  
  27. +}  
  28. static int read_frame (void)
  29. {
  30.          struct v4l2_buffer buf;
  31. @@ -402,11 +405,12 @@ static int read_frame (void)
  32. //        printf ("buf.index dq is %d,\n",buf.index);
  33. //        printf ("buf.m.offset = 0x%x\n",buf.m.offset);
  34.          //disp_set_addr(320,240,&buf.m.offset);
  35. -        disp_set_addr(disp_size.width, disp_size.height,&buf.m.offset);
  36. +//        disp_set_addr(disp_size.width, disp_size.height,&buf.m.offset);

  37.          //printf ("press ENTER to continue!\n");
  38.          //getchar();
  39.          //fwrite(buffers[buf.index].start, buffers[buf.index].length, 1, file_fd);
  40. +        process_image(buffers[buf.index].start, buffers[buf.index].length);  



  41. @@ -716,8 +720,8 @@ int main_test (void)
  42.                                          //goto close;
  43.                          }

  44. -                        disp_size.width = fmt.fmt.pix.width;
  45. -                        disp_size.height = fmt.fmt.pix.height;
  46. +//                        disp_size.width = fmt.fmt.pix.width;
  47. +                        //disp_size.height = fmt.fmt.pix.height;

  48. //                printf("%s %d\n",__FILE__,__LINE__);
  49.                  if(ioctl_test==1)
  50. @@ -829,11 +833,6 @@ int main_test (void)
  51.                  printf ("VIDIOC_QBUF failed\n");
  52.          }

  53. -#ifdef DISPLAY
  54. -                                disp_int(disp_size.width,disp_size.height);
  55. -                                disp_start();
  56. -#endif
  57. -
  58.          type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

  59.          if (-1 == ioctl (fd, VIDIOC_STREAMON, &type))
  60. @@ -846,10 +845,11 @@ int main_test (void)
  61.          else
  62.                  printf ("VIDIOC_STREAMON ok\n");

  63. -  count = read_num;
  64. +        fp = fopen(filename, "wa+");  
  65. +         count = 100;

  66. -//        while(count-->0)
  67. -        while(1)
  68. +        while(count-->0)
  69. +//        while(1)
  70.          {
  71.                  //gettimeofday(&time_test,&tz);

  72. @@ -876,16 +876,13 @@ int main_test (void)
  73.                     if (0 == r) {
  74.                          fprintf (stderr, "select timeout\n");
  75.                          exit (EXIT_FAILURE);
  76. -                                                                }
  77. +                   }

  78. -#ifdef DISPLAY
  79. -      if(count==read_num-1)
  80. -              disp_on();
  81. -#endif
  82.                     if (read_frame ())
  83.                     break;
  84.                  }
  85.          }
  86. +        fclose(fp);

  87.          if(control_test==1)
  88.          {
  89. @@ -987,10 +984,6 @@ unmap:
  90.                          printf ("munmap error");
  91.                  }
  92.          }
  93. -        disp_stop();
  94. -        disp_quit();
  95. -
  96. -

  97.          close (fd);
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

7

主题

1

好友

2404

积分

金牌会员

Rank: 6Rank: 6

贡献
458
金钱
949
威望
458
买家信用
卖家信用
积分
2404
发表于 2015-7-3 11:08:29 |显示全部楼层
生成的文件应该是没有写入数据,你好好检查下
回复

使用道具 举报

1

主题

0

好友

313

积分

中级会员

Rank: 3Rank: 3

贡献
67
金钱
103
威望
67
买家信用
卖家信用
积分
313
发表于 2015-7-7 09:44:09 |显示全部楼层
blessed 发表于 2015-7-3 11:08
生成的文件应该是没有写入数据,你好好检查下

感谢回复。加载了sunxi_cedar_mod  驱动之后现在保存视频文件能抓到了, 不过效果很差,一闪一闪的绿色
传到了网盘上
http://pan.baidu.com/s/1bnvx1Qv
回复

使用道具 举报

1

主题

0

好友

428

积分

中级会员

Rank: 3Rank: 3

贡献
47
金钱
84
威望
147
买家信用
卖家信用
积分
428
发表于 2015-7-20 20:56:42 |显示全部楼层
Linux- 发表于 2015-7-7 09:44
感谢回复。加载了sunxi_cedar_mod  驱动之后现在保存视频文件能抓到了, 不过效果很差,一闪一闪的绿色
...

楼主 求救啊 我用你x修改过的程序,抓取图像数据还是全是零,楼主大神 老师 ,你是怎么解决的?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

QQ|Archiver|手机版|邮件群发|cubie.cc---深刻的嵌入式技术和应用讨论中文社区 ( 粤ICP备13051116号-1  

GMT+8, 2020-4-9 11:09 , Processed in 0.024644 second(s), 12 queries , Apc On.

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc. | Style by Coxxs

回顶部