在Linux中读取USB网络摄像头的输出

时间:2022-01-16 16:52:04

I was experimenting with a little bit with fread and fwrite in C. So i wrote this little program in C to get data from a webcam and dump it into a file. The following is the source:

我正在用C中的fread和fwrite进行一些实验。所以我用C编写了这个小程序来从网络摄像头获取数据并将其转储到文件中。以下是来源:

#include <stdio.h>
#include <stdlib.h>
#define SIZE 307200 // number of pixels (640x480 for my webcam)
int main() {
    FILE *camera, *grab;
    camera=fopen("/dev/video0", "rb");
    grab=fopen("grab.raw", "wb");
    float data[SIZE];
    fread(data, sizeof(data[0]), SIZE, camera);
    fwrite(data, sizeof(data[0]), SIZE, grab);
    fclose(camera);
    fclose(grab); 
    return 0;
}

The program works when compiled (gcc -o snap camera.c). What took me by surprise was that the output file was not a raw data dump but a JPEG file. Output of the file command on linux on the programs output file showed it was a JPEG image data: JFIF Standard 1.01. The file was viewable on an image viewer, although a little saturated.

程序在编译时工作(gcc -o snap camera.c)。令我惊讶的是输出文件不是原始数据转储而是JPEG文件。在程序输出文件上输出linux上的file命令显示它是JPEG图像数据:JFIF Standard 1.01。该文件在图像查看器上可见,尽管有点饱和。

How or why does this happen? I did not use any JPEG encoding libraries in the source or the program. Does the camera output JPEG natively? The webcam is a Sony Playstation 2 EyeToy which was manufactured by Logitech. The system is Debian Linux.

这是怎么发生的?我没有在源代码或程序中使用任何JPEG编码库。相机是否原生输出JPEG?网络摄像头是由Logitech制造的Sony Playstation 2 EyeToy。该系统是Debian Linux。

1 个解决方案

#1


7  

The Sony EyeToy has an OV7648 sensor with the quite popular OV519 bridge. The OV519 outputs frames in JPEG format - and if I remember correctly from my own cameras that's the only format that it supports.

Sony EyeToy有一个OV7648传感器,配有非常流行的OV519桥接器。 OV519以JPEG格式输出帧 - 如果我从自己的相机中正确记得那是它支持的唯一格式。

Cameras like this require either application support, or a special driver that will decompress the frames before delivery to userspace. Apparently in your case the driver delivers the JPEG frames in their original form, which is why you are getting JPEG data in the output.

像这样的摄像机需要应用程序支持,或者在交付给用户空间之前将解压缩帧的特殊驱动程序。显然,在您的情况下,驱动程序以原始形式提供JPEG帧,这就是您在输出中获取JPEG数据的原因。

BTW, you should really have a look at the Video4Linux2 API for the proper way to access video devices on Linux - a simple open()/read()/close() is generally not enough...

顺便说一句,你应该看一下Video4Linux2 API,以便在Linux*问视频设备的正确方法 - 简单的open()/ read()/ close()通常是不够的......

#1


7  

The Sony EyeToy has an OV7648 sensor with the quite popular OV519 bridge. The OV519 outputs frames in JPEG format - and if I remember correctly from my own cameras that's the only format that it supports.

Sony EyeToy有一个OV7648传感器,配有非常流行的OV519桥接器。 OV519以JPEG格式输出帧 - 如果我从自己的相机中正确记得那是它支持的唯一格式。

Cameras like this require either application support, or a special driver that will decompress the frames before delivery to userspace. Apparently in your case the driver delivers the JPEG frames in their original form, which is why you are getting JPEG data in the output.

像这样的摄像机需要应用程序支持,或者在交付给用户空间之前将解压缩帧的特殊驱动程序。显然,在您的情况下,驱动程序以原始形式提供JPEG帧,这就是您在输出中获取JPEG数据的原因。

BTW, you should really have a look at the Video4Linux2 API for the proper way to access video devices on Linux - a simple open()/read()/close() is generally not enough...

顺便说一句,你应该看一下Video4Linux2 API,以便在Linux*问视频设备的正确方法 - 简单的open()/ read()/ close()通常是不够的......