Страницы

Поиск по вопросам

вторник, 13 ноября 2018 г.

Как получить данные из камеры?

Вообще хотел бы получить данные из камеры, преобразовать это в flv формат, и вывести по rtmp, но наверное это только мечта. Пробывал ffmpeg программу прочитать, я почему то уверен что там всё грамотно написано, но я ничего не понел. Вот хотел бы узнать как в линуксе можно открыть устройство камеру и получить видео поток, чтобы вывести его на экран.


Ответ

Вот хотел бы узнать как в линуксе можно открыть устройство камеру и получить видео поток, чтобы вывести его на экран.
vlc /dev/video0
получить видео поток
Документация по v4l2
По замечанию @andreymal - краткий мануал
Открытие устройства
int fd;
fd = open("/dev/video0", O_RDWR); if (fd == -1) { // ... }
Подготовка к захвату кадров
struct v4l2_capability caps = {0}; if (-1 == ioctl(fd, VIDIOC_QUERYCAP, &caps)) { // ... }
Формат кадра
struct v4l2_format fmt = {0}; fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; fmt.fmt.pix.width = 320; fmt.fmt.pix.height = 240; fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG; fmt.fmt.pix.field = V4L2_FIELD_NONE;
if (-1 == ioctl(fd, VIDIOC_S_FMT, &fmt)) { // ... }
Подготовка буфферов
struct v4l2_requestbuffers req = {0}; req.count = 1; req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory = V4L2_MEMORY_MMAP;
if (-1 == ioctl(fd, VIDIOC_REQBUFS, &req)) { // ... }
struct v4l2_buffer buf = {0}; buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; buf.index = bufferindex; if(-1 == ioctl(fd, VIDIOC_QUERYBUF, &buf)) { // ... }
buffer = mmap (NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset);
Захват изображения
if(-1 == ioctl(fd, VIDIOC_STREAMON, &buf.type)) { // ... }
fd_set fds; FD_ZERO(&fds); FD_SET(fd, &fds); struct timeval tv = {0}; tv.tv_sec = 2; int r = select(fd+1, &fds, NULL, NULL, &tv); if(-1 == r) { // ... }
if(-1 == ioctl(fd, VIDIOC_DQBUF, &buf)) { // ... }

Комментариев нет:

Отправить комментарий