Страницы

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

воскресенье, 22 декабря 2019 г.

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

#cpp #linux #c


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


Ответы

Ответ 1



Вот хотел бы узнать как в линуксе можно открыть устройство камеру и получить видео поток, чтобы вывести его на экран. 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)) { // ... }

Ответ 2



Ответ isnullxbh базируется на использовании драйвера v4l2. Можно существенно сократить объём усилий, затрачиваемых на написание кода, если воспользоваться библиотекой openCV. Простейший пример из доки: #include #include #include using namespace cv; using namespace std; int main(int, char**) { Mat frame; //--- INITIALIZE VIDEOCAPTURE VideoCapture cap; // open the default camera using default API cap.open(0); /* OR advance usage: select any API backend int deviceID = 0; // 0 = open default camera int apiID = cv::CAP_ANY; // 0 = autodetect default API // open selected camera using selected API cap.open(deviceID + apiID); */ // check if we succeeded if (!cap.isOpened()) { cerr << "ERROR! Unable to open camera\n"; return -1; } //--- GRAB AND WRITE LOOP cout << "Start grabbing" << endl << "Press any key to terminate" << endl; for (;;) { // wait for a new frame from camera and store it into 'frame' cap.read(frame); // check if we succeeded if (frame.empty()) { cerr << "ERROR! blank frame grabbed\n"; break; } // show live and wait for a key with timeout long enough to show images imshow("Live", frame); if (waitKey(5) >= 0) break; } // the camera will be deinitialized automatically in VideoCapture destructor return 0; }

Ответ 3



ffmpeg -s -f video4linux2 -i /dev/video0 -c:v libx264 \ -preset -f flv "rtmp://rtmp-publish-url.tld/something/else live=1"

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

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