Чтение вывода веб-камеры USB в Linux

Я экспериментировал немного с fread и fwrite в C. Поэтому я написал эту небольшую программу на 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;
}

Программа работает при компиляции (gcc -o snap camera.c). Меня удивило, что выходной файл не был сырым дампом данных, а файлом JPEG. Вывод команды file в linux в выходном файле программы показал, что это данные изображения JPEG: JFIF Standard 1.01. Файл был доступен для просмотра изображений, хотя и немного насыщен.

Как или почему это происходит? Я не использовал библиотеки кодирования JPEG в источнике или программе. Выводит ли камера JPEG изначально? Веб-камера - это Sony Playstation 2 EyeToy, которая была выпущена Logitech. Система - Debian Linux.

Ответ 1

Sony EyeToy имеет датчик OV7648 с довольно популярным мостом OV519. OV519 выводит кадры в формате JPEG - и если я правильно помню свои собственные камеры, это единственный формат, который он поддерживает.

Для таких камер требуется либо поддержка приложений, либо специальный драйвер, который будет распаковывать кадры перед доставкой в ​​пользовательское пространство. По-видимому, в вашем случае драйвер поставляет фреймы JPEG в их оригинальной форме, поэтому вы получаете данные JPEG на выходе.

Кстати, вы действительно должны взглянуть на Video4Linux2 API для правильного доступа к видеоустройствам в Linux - простого open()/read()/close(), как правило, недостаточно...