Linux- 发表于 2015-6-24 15:57:38

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

本帖最后由 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

播放绿屏


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

//#define READ_NUM 5000
-#define DISPLAY
#define LCD_WIDTH                1024
#define LCD_HEIGHT            768

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

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

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

-FILE *file_fd;
+FILE *fp;
static unsigned long file_length;
static unsigned char *file_name;

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

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

         //printf ("press ENTER to continue!\n");
         //getchar();
         //fwrite(buffers.start, buffers.length, 1, file_fd);
+      process_image(buffers.start, buffers.length);



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

-                        disp_size.width = fmt.fmt.pix.width;
-                        disp_size.height = fmt.fmt.pix.height;
+//                        disp_size.width = fmt.fmt.pix.width;
+                        //disp_size.height = fmt.fmt.pix.height;

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

-#ifdef DISPLAY
-                              disp_int(disp_size.width,disp_size.height);
-                              disp_start();
-#endif
-
         type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

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

-count = read_num;
+      fp = fopen(filename, "wa+");
+         count = 100;

-//      while(count-->0)
-      while(1)
+      while(count-->0)
+//      while(1)
         {
               //gettimeofday(&time_test,&tz);

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

-#ifdef DISPLAY
-      if(count==read_num-1)
-            disp_on();
-#endif
                  if (read_frame ())
                  break;
               }
         }
+      fclose(fp);

         if(control_test==1)
         {
@@ -987,10 +984,6 @@ unmap:
                         printf ("munmap error");
               }
         }
-      disp_stop();
-      disp_quit();
-
-

         close (fd);

blessed 发表于 2015-7-3 11:08:29

生成的文件应该是没有写入数据,你好好检查下

Linux- 发表于 2015-7-7 09:44:09

blessed 发表于 2015-7-3 11:08 static/image/common/back.gif
生成的文件应该是没有写入数据,你好好检查下

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

有用书生 发表于 2015-7-20 20:56:42

Linux- 发表于 2015-7-7 09:44 static/image/common/back.gif
感谢回复。加载了sunxi_cedar_mod驱动之后现在保存视频文件能抓到了, 不过效果很差,一闪一闪的绿色
...

楼主 求救啊 我用你x修改过的程序,抓取图像数据还是全是零,楼主大神 老师 ,你是怎么解决的?:'(
页: [1]
查看完整版本: Cubieboard2 V4l2 采集保存成yuv文件播放绿屏