यह बहुत आसान है, आप अपने नियंत्रण में कैमरे को प्राप्त करने के लिए कुछ ioctls सक्रिय करने के बाद, एक videodevice पर read
कर सकते हैं।
आप इस नौकरी के लिए v4l2 का उपयोग कर सकते हैं। आप उन कदमों में ऐसा करते हैं:
- ओपन कैमरे के devicefile (आमतौर पर "/ dev/video0")
- बताएँ V4L2 कि आप डिवाइस के कुछ क्षमता जानना चाहते
- बताएँ V4L2 पढ़ने के लिए डिवाइस से
- एक कार्यान्वयन मैं इस काम के लिए उपयोग करें बताएँ V4L2 जो प्रारूप आप
यहाँ का उपयोग करना चाहते है। यह कैमरे को 320x240 पिक्सल में एक वीडियो कैप्चर करने के लिए सेट करेगा, लेकिन आप संकल्प पढ़ सकते हैं, कैमरा v4l2_capability
संरचना से सक्षम है।
इसके अलावा मैंने अपने पीएस 2 आईटॉय की तुलना में विभिन्न कैमरों पर कोड का परीक्षण नहीं किया है, लेकिन इसे ज्यादातर qv4l2 नामक नमूना कार्यक्रम से लिया जाता है (आप इसे here से प्राप्त कर सकते हैं)। इस कार्यक्रम को उन सभी अन्य मुद्दों को हल करना चाहिए जिन्हें आप आमतौर पर वहां देखते हैं।
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h> /* low-level i/o */
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <linux/videodev2.h>
static int xioctl(int fh, int request, void *arg)
{
int r;
do {
r = ioctl(fh, request, arg);
} while (-1 == r && EINTR == errno);
return r;
}
int allocCamera(const char* file)
{
struct v4l2_capability cap;
struct v4l2_crop crop;
struct v4l2_format fmt;
int camera_fd = open(file, O_RDONLY);
if (-1 == xioctl (camera_fd, VIDIOC_QUERYCAP, &cap)) {
if (EINVAL == errno) {
fprintf (stderr, "%s is no V4L2 device\n", file);
exit (EXIT_FAILURE);
} else {
printf("\nError in ioctl VIDIOC_QUERYCAP\n\n");
exit(0);
}
}
if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
fprintf (stderr, "%s is no video capture device\n", file);
exit (EXIT_FAILURE);
}
if (!(cap.capabilities & V4L2_CAP_READWRITE)) {
fprintf (stderr, "%s does not support read i/o\n", file);
exit (EXIT_FAILURE);
}
memset(&fmt, 0, sizeof(fmt));
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = 320;
fmt.fmt.pix.height = 240;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
if (-1 == xioctl(camera_fd, VIDIOC_S_FMT, &fmt)) {
printf("VIDIOC_S_FMT");
}
return camera_fd;
}
स्टैक ओवरफ़्लो में आपका स्वागत है! StackOverflow इस प्रश्न के लिए उचित जगह नहीं है। हम आपके लिए अपना कोड नहीं लिखते हैं। आपको अपना कोडिंग करने की ज़रूरत है और यदि आप सुनिश्चित नहीं हैं कि कुछ उम्मीद के अनुसार क्यों काम नहीं कर रहा है, तो कोड को उस स्पष्टीकरण के साथ पोस्ट करें जिसे आप उम्मीद कर रहे थे, और यह वास्तव में सभी त्रुटि संदेशों सहित क्या कर रहा है। [स्टैक ओवरफ्लो के बारे में] देखें (http://stackoverflow.com/about)। –