源程序代码如下:
int
to_yuv (FILE *out, int fd, int width, int height)
{
struct video_mbuf vid_buf;
struct video_mmap vid_mmap;
int do_read = 0;
int done = 0;
char *map;
int size;
int num = 0;
double ms_time0, ms_time1;
int tpf = 40; /* 40 ms time per frame (= 25 fps) */
if (ioctl (fd, VIDIOCGMBUF, &vid_buf) == -1) {
do_read = 1;
} else {
fprintf (stderr, "buffsize=%d frames=%d\n",vid_buf.size,vid_buf.frames);
}
if (!do_read) {
map = mmap (0, vid_buf.size, PROT_READ|PROT_WRITE,MAP_SHARED, fd, 0);
if ((unsigned char *)-1 == (unsigned char *)map) {
perror ("mmap()");
return -1;
}
vid_mmap.format = VIDEO_PALETTE_YUV420P;
vid_mmap.frame = 0;
vid_mmap.width = width;
vid_mmap.height =height;
size = (width * height) + (width * height / 2);
fprintf (stderr, "%dx%d bufsize=%d size=%d\n",
width, height, vid_buf.size, size);
printf ("YUV4MPEG%d %d %d\n", width, height, 3);
if (ioctl (fd, VIDIOCMCAPTURE, &vid_mmap) == -1) {
perror ("ioctl VIDIOCMCAPTURE");
munmap (map, vid_buf.size);
return -1;
}
vid_mmap.frame = 1;
if (ioctl (fd, VIDIOCMCAPTURE, &vid_mmap) == -1) {
perror ("ioctl VIDIOCMCAPTURE");
munmap (map, vid_buf.size);
return -1;
}
while (!done) {
ms_time0 = ms_time(); /* milli seconds */
vid_mmap.frame = vid_mmap.frame > 0 ? 0 : 1;
if (ioctl (fd, VIDIOCSYNC, &vid_mmap.frame) == -1) {
perror ("ioctl VIDIOCSYNC");
munmap (map, vid_buf.size);
return -1;
}
printf ("FRAME\n");
fwrite (map + vid_buf.offsets[vid_mmap.frame], 1, size, stdout);
if (ioctl (fd, VIDIOCMCAPTURE, &vid_mmap) == -1) {
perror ("ioctl VIDIOCMCAPTURE");
munmap (map, vid_buf.size);
return -1;
}
num++;
ms_time1 = ms_time () - ms_time0;
if (ms_time1 < (double)tpf) {
usleep (tpf - (int)ms_time1);
} else {
fprintf (stderr, "delayed: dt=%f\n",ms_time1 - (double)tpf);
}
}
munmap (map, vid_buf.size);
} else {
fprintf (stderr, "still not implemented\n");
}
return 0;
}
他是把多针的图像数据都fwrite (map + vid_buf.offsets[vid_mmap.frame], 1, size, stdout);存在了stdout中如何把它里面的每一针数据提取出来啊?各位帮帮忙啊!!不胜感激
[ 此贴被XChinux在2007-01-08 16:17重新编辑 ]