Jadual Kandungan
二、V4L2的应用
Rumah pangkalan data tutorial mysql V4L2驱动的移植与应用(二)

V4L2驱动的移植与应用(二)

Jun 07, 2016 pm 03:33 PM
bawah memperkenalkan permohonan Mudah memandu

二、 V4L2 的应用 下面简单介绍一下 V4L2 驱动的应用流程。 1、 视频采集的基本流程 一般的,视频采集都有如下流程: 2、 打开视频设备 在 V4L2 中,视频设备被看做一个文件。使用 open 函数打开这个设备: // 用非阻塞模式打开摄像头设备 int cameraFd; cam

二、V4L2的应用

    下面简单介绍一下V4L2驱动的应用流程。

1、  视频采集的基本流程

一般的,视频采集都有如下流程:

 

 

2、  打开视频设备

V4L2中,视频设备被看做一个文件。使用open函数打开这个设备:

// 用非阻塞模式打开摄像头设备
int cameraFd;
cameraFd = open("/dev/video0", O_RDWR | O_NONBLOCK, 0);
//
如果用阻塞模式打开摄像头设备,上述代码变为:
//cameraFd = open("/dev/video0", O_RDWR, 0);

关于阻塞模式和非阻塞模式:应用程序能够使用阻塞模式或非阻塞模式打开视频设备,如果使用非阻塞模式调用视频设备,即使尚未捕获到信息,驱动依旧会把缓存(DQBUFF)里的东西返回给应用程序。

3、  设定属性及采集方式

打开视频设备后,可以设置该视频设备的属性,例如裁剪、缩放等。这一步是可选的。在Linux编程中,一般使用ioctl函数来对设备的I/O通道进行管理:

extern int ioctl (int __fd, unsigned long int __request, ...) __THROW;

__fd:设备的ID,例如刚才用open函数打开视频通道后返回的cameraFd

__request:具体的命令标志符。

在进行V4L2开发中,一般会用到以下的命令标志符:

VIDIOC_REQBUFS:分配内存

VIDIOC_QUERYBUF:把VIDIOC_REQBUFS中分配的数据缓存转换成物理地址

VIDIOC_QUERYCAP:查询驱动功能

VIDIOC_ENUM_FMT:获取当前驱动支持的视频格式

VIDIOC_S_FMT:设置当前驱动的频捕获格式

VIDIOC_G_FMT:读取当前驱动的频捕获格式

VIDIOC_TRY_FMT:验证当前驱动的显示格式

VIDIOC_CROPCAP:查询驱动的修剪能力

VIDIOC_S_CROP:设置视频信号的边框

VIDIOC_G_CROP:读取视频信号的边框

VIDIOC_QBUF:把数据从缓存中读取出来

VIDIOC_DQBUF:把数据放回缓存队列

VIDIOC_STREAMON:开始视频显示函数

VIDIOC_STREAMOFF:结束视频显示函数

VIDIOC_QUERYSTD:检查当前视频设备支持的标准,例如PALNTSC

这些IO调用,有些是必须的,有些是可选择的。

4、  检查当前视频设备支持的标准

在亚洲,一般使用PAL720X576)制式的摄像头,而欧洲一般使用NTSC720X480),使用VIDIOC_QUERYSTD来检测:

v4l2_std_id std;
do {
  ret = ioctl(fd, VIDIOC_QUERYSTD, &std);
} while (ret == -1 && errno == EAGAIN);
switch (std) {
    case V4L2_STD_NTSC:
        //……
    case V4L2_STD_PAL:
        //……
}

5、  设置视频捕获格式

当检测完视频设备支持的标准后,还需要设定视频捕获格式:

struct v4l2_format    fmt;
memset ( &fmt, 0, sizeof(fmt) );
fmt.type                = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width       = 720;
fmt.fmt.pix.height      = 576;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
fmt.fmt.pix.field       = V4L2_FIELD_INTERLACED;
if (ioctl(fd, VIDIOC_S_FMT, &fmt) == -1) {
  return -1;
}

v4l2_format结构体定义如下:

struct v4l2_format
{
    enum v4l2_buf_type type;    //
数据流类型,必须永远是
V4L2_BUF_TYPE_VIDEO_CAPTURE
    union
    {
        struct v4l2_pix_format    pix; 
        struct v4l2_window        win; 
        struct v4l2_vbi_format    vbi; 
        __u8    raw_data[200];         
    } fmt;
};
struct v4l2_pix_format
{
    __u32                   width;         //
宽,必须是16的倍数

    __u32                   height;        //
高,必须是16的倍数
    __u32                   pixelformat;   //
视频数据存储类型,例如是YUV422还是RGB
    enum v4l2_field         field;
    __u32                   bytesperline;   
    __u32                   sizeimage;
    enum v4l2_colorspace    colorspace;
    __u32                   priv;      
};

6、  分配内存

接下来可以为视频捕获分配内存:

struct v4l2_requestbuffers  req;
if (ioctl(fd, VIDIOC_REQBUFS, &req) == -1) {
  return -1;
}

v4l2_requestbuffers定义如下:

struct v4l2_requestbuffers
{
    __u32               count;  //
缓存数量,也就是说在缓存队列里保持多少张照片

    enum v4l2_buf_type  type;   //
数据流类型,必须永远是V4L2_BUF_TYPE_VIDEO_CAPTURE
    enum v4l2_memory    memory; // V4L2_MEMORY_MMAP
V4L2_MEMORY_USERPTR
    __u32               reserved[2];
};

7、  获取并记录缓存的物理空间

使用VIDIOC_REQBUFS,我们获取了req.count个缓存,下一步通过调用VIDIOC_QUERYBUF命令来获取这些缓存的地址,然后使用mmap函数转换成应用程序中的绝对地址,最后把这段缓存放入缓存队列:

 

typedef struct VideoBuffer {
    void   *start;
    size_t  length;
} VideoBuffer;

VideoBuffer*          buffers = calloc( req.count, sizeof(*buffers) );
struct v4l2_buffer    buf;

for (numBufs = 0; numBufs     memset( &buf, 0, sizeof(buf) );
    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    buf.memory = V4L2_MEMORY_MMAP;
    buf.index = numBufs;
    //
读取缓存

    if (ioctl(fd, VIDIOC_QUERYBUF, &buf) == -1) {
        return -1;
    }

    buffers[numBufs].length = buf.length;
    //
转换成相对地址
    buffers[numBufs].start = mmap(NULL, buf.length,
        PROT_READ | PROT_WRITE,
        MAP_SHARED,
        fd, buf.m.offset);

    if (buffers[numBufs].start == MAP_FAILED) {
        return -1;
    }

    //
放入缓存队列
    if (ioctl(fd, VIDIOC_QBUF, &buf) == -1) {
        return -1;
    }
}

8、  关于视频采集方式

操作系统一般把系统使用的内存划分成用户空间和内核空间,分别由应用程序管理和操作系统管理。应用程序可以直接访问内存的地址,而内核空间存放的是供内核访问的代码和数据,用户不能直接访问。v4l2捕获的数据,最初是存放在内核空间的,这意味着用户不能直接访问该段内存,必须通过某些手段来转换地址。

一共有三种视频采集方式:

1)使用readwrite方式:直接使用readwrite函数进行读写。这种方式最简单,但是这种方式会在用户空间和内核空间不断拷贝数据,同时在用户空间和内核空间占用大量内存,效率不高。

2)内存映射方式(mmap):把设备里的内存映射到应用程序中的内存控件,直接处理设备内存,这是一种有效的方式。上面的mmap函数就是使用这种方式。

3)用户指针模式:内存由用户空间的应用程序分配,并把地址传递到内核中的驱动程序,然后由v4l2驱动程序直接将数据填充到用户空间的内存中。这点需要在v4l2_requestbuffers里将memory字段设置成V4L2_MEMORY_USERPTR

第一种方式效率是最低的,后面两种方法都能提高执行的效率,但是对于mmap 方式,文档中有这样一句描述 --Remember the buffers are allocated in physical memory, as opposed to virtual memory which can be swapped out to disk. Applications should free the buffers as soon as possible with the munmap () function .(使用mmap方法的时候,buffers相当于是在内核空间中分配的,这种情况下,这些buffer是不能被交换到虚拟内存中,虽然这种方法不怎么影响读写效率,但是它一直占用着内核空间中的内存,当系统的内存有限的时候,如果同时运行有大量的进程,则对系统的整体性能会有一定的影响。)

       所以,对于三种视频采集方式的选择,推荐的顺序是 userptr mmap read-write 。当使用 mmap userptr 方式的时候,有一个环形缓冲队列的概念,这个队列中,有 n buffer ,驱动程序采集到的视频帧数据,就是存储在每个 buffer 中。在每次用 VIDIOC_DQBUF 取出一个 buffer ,并且处理完数据后,一定要用 VIDIOC_QBUF 将这个 buffer 再次放回到环形缓冲队列中。环形缓冲队列,也使得这两种视频采集方式的效率高于直接 read/write

9、  处理采集数据

V4L2有一个数据缓存,存放req.count数量的缓存数据。数据缓存采用FIFO的方式,当应用程序调用缓存数据时,缓存队列将最先采集到的视频数据缓存送出,并重新采集一张视频数据。这个过程需要用到两个ioctl命令,VIDIOC_DQBUFVIDIOC_QBUF

struct v4l2_buffer buf;
memset(&buf,0,sizeof(buf));
buf.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory=V4L2_MEMORY_MMAP;
buf.index=0;

//读取缓存
if (ioctl(cameraFd, VIDIOC_DQBUF, &buf) == -1)
{
    return -1;
}
//…………
视频处理算法
//
重新放入缓存队列
if (ioctl(cameraFd, VIDIOC_QBUF, &buf) == -1) {

    return -1;
}

10、              关闭视频设备

使用close函数关闭一个视频设备

close(cameraFd)

(待续)

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Adakah pemandu Logitech ghub tidak menyokong win7? -Mengapa pemacu Logitech ghub hanya boleh dipasang pada pemacu c? Adakah pemandu Logitech ghub tidak menyokong win7? -Mengapa pemacu Logitech ghub hanya boleh dipasang pada pemacu c? Mar 18, 2024 pm 05:37 PM

Adakah pemandu Logitech ghub tidak menyokong win7? Tidak serasi. Memandangkan Windows 7 telah berhenti mengemas kini dan bukan lagi sistem pengendalian utama Microsoft, banyak perisian baharu tidak lagi menyokongnya, seperti Logitech ghub. Antara muka utama pemacu Logitech: 1. Antara muka perisian utama berada di sebelah kiri Tiga butang ialah tetapan pencahayaan, butang dan kepekaan. 2. Dalam penetapan antara muka pencahayaan, kesan khas umum adalah agak konvensional, dan kesan audio visual adalah kemuncak Ia boleh menukar warna mengikut frekuensi bunyi, dan boleh ditetapkan mengikut jalur tinggi, tengah dan bes , dengan warna dan kesan yang berbeza. 3. Dalam tetapan butang, pengguna boleh mengeditnya di sini mengikut keperluan khas mereka. 4. Dalam tetapan sensitiviti, ramai pengguna akan mempunyai beberapa tetapan mereka sendiri. Mereka boleh menambah titik penukaran kelajuan DPI dengan sendirinya, tetapi

Peranan dan aplikasi praktikal simbol anak panah dalam PHP Peranan dan aplikasi praktikal simbol anak panah dalam PHP Mar 22, 2024 am 11:30 AM

Peranan dan aplikasi praktikal simbol anak panah dalam PHP Dalam PHP, simbol anak panah (->) biasanya digunakan untuk mengakses sifat dan kaedah objek. Objek adalah salah satu konsep asas pengaturcaraan berorientasikan objek (OOP) dalam PHP Dalam pembangunan sebenar, simbol anak panah memainkan peranan penting dalam mengendalikan objek. Artikel ini akan memperkenalkan peranan dan aplikasi praktikal simbol anak panah, dan menyediakan contoh kod khusus untuk membantu pembaca memahami dengan lebih baik. 1. Peranan simbol anak panah untuk mengakses sifat sesuatu objek Simbol anak panah boleh digunakan untuk mengakses sifat objek. Apabila kita instantiate sepasang

Bagaimana untuk membuat asal Padam dari Skrin Utama dalam iPhone Bagaimana untuk membuat asal Padam dari Skrin Utama dalam iPhone Apr 17, 2024 pm 07:37 PM

Memadamkan sesuatu yang penting daripada skrin utama anda dan cuba mendapatkannya semula? Anda boleh meletakkan ikon apl kembali pada skrin dalam pelbagai cara. Kami telah membincangkan semua kaedah yang boleh anda ikuti dan meletakkan semula ikon aplikasi pada skrin utama Cara Buat Asal Alih Keluar dari Skrin Utama dalam iPhone Seperti yang kami nyatakan sebelum ini, terdapat beberapa cara untuk memulihkan perubahan ini pada iPhone. Kaedah 1 – Gantikan Ikon Apl dalam Pustaka Apl Anda boleh meletakkan ikon apl pada skrin utama anda terus daripada Pustaka Apl. Langkah 1 – Leret ke sisi untuk mencari semua apl dalam pustaka apl. Langkah 2 – Cari ikon apl yang anda padamkan sebelum ini. Langkah 3 – Hanya seret ikon apl dari pustaka utama ke lokasi yang betul pada skrin utama. Ini adalah gambar rajah aplikasi

Cara memasang pemacu win11 tanpa tandatangan digital_Tutorial tentang cara berurusan dengan pemandu win11 tanpa tandatangan digital Cara memasang pemacu win11 tanpa tandatangan digital_Tutorial tentang cara berurusan dengan pemandu win11 tanpa tandatangan digital Mar 20, 2024 pm 04:46 PM

Sesetengah pengguna telah menghadapi beberapa masalah semasa memasang pemacu untuk komputer win11 Komputer menggesa bahawa tandatangan digital fail ini tidak dapat disahkan, mengakibatkan ketidakupayaan untuk memasang pemacu. Sila lihat pengenalan berikut untuk butiran. 1. Tekan tetingkap [Win + [Ctrl+Shift+Enter] Buka tetingkap Windows Powershell dengan hak pentadbir 3. tetingkap Kawalan Akaun Pengguna, adakah anda ingin membenarkan aplikasi ini membuat perubahan pada peranti anda; . Pentadbir: Windows Powers

Daripada pemula hingga mahir: Terokai pelbagai senario aplikasi arahan tee Linux Daripada pemula hingga mahir: Terokai pelbagai senario aplikasi arahan tee Linux Mar 20, 2024 am 10:00 AM

Perintah Linuxtee ialah alat baris arahan yang sangat berguna yang boleh menulis output ke fail atau menghantar output ke arahan lain tanpa menjejaskan output sedia ada. Dalam artikel ini, kami akan meneroka secara mendalam pelbagai senario aplikasi arahan Linuxtee, daripada kemasukan kepada kemahiran. 1. Penggunaan asas Mula-mula, mari kita lihat pada penggunaan asas arahan tee. Sintaks arahan tee adalah seperti berikut: tee[OPTION]...[FAIL]...Arahan ini akan membaca data daripada input standard dan menyimpan data ke

Pengenalan kepada kemahiran dan sifat Hua Yishan Heart of the Moon Lu Shu Pengenalan kepada kemahiran dan sifat Hua Yishan Heart of the Moon Lu Shu Mar 23, 2024 pm 05:30 PM

Di Hua Yishan Heart Moon, Lu Shu ialah seorang selebriti SSR. Dia diletakkan sebagai pendayung belakang tunggal dan mempunyai kadar pukulan kritikal yang sangat mengagumkan. Datang dan lihat pengenalan kepada kemahiran dan sifat Hua Yishan Heart of the Moon Lu Shu. Atribut Selebriti Kemahiran Selebriti 1. Lu Ming Shuzhong Penerangan Kemahiran: Lu Shu dilahirkan di Qiongqihui di Shuzhong Dia telah berlatih seni mempertahankan diri sejak dia masih kecil dan mempunyai kemahiran seni mempertahankan diri yang cemerlang. Menyebabkan kerosakan serangan asas sama dengan 100% kuasa serangan barisan belakang musuh, dan mengurangkan kemarahan sasaran sebanyak 10 mata. Atribut kemahiran: Tahap 2: Kerosakan serangan asas meningkat kepada 105%. Tahap 2: Kerosakan serangan asas dinaikkan kepada 110%, dan kemarahan sasaran dikurangkan sebanyak 15 mata. Tahap 2: Kerosakan serangan asas meningkat kepada 115%. Tahap 2: Kerosakan serangan asas dinaikkan kepada 120%, dan kemarahan sasaran dikurangkan sebanyak 20 mata. Tahap 2: Serangan asas

Pengenalan terperinci fungsi Samsung S24ai Pengenalan terperinci fungsi Samsung S24ai Jun 24, 2024 am 11:18 AM

2024 ialah tahun pertama telefon mudah alih AI Semakin banyak telefon mudah alih menyepadukan berbilang fungsi AI Diperkasakan oleh teknologi pintar AI, telefon mudah alih kami boleh digunakan dengan lebih cekap dan mudah. Baru-baru ini, siri Galaxy S24 yang dikeluarkan pada awal tahun ini sekali lagi telah meningkatkan pengalaman AI generatifnya Mari lihat pengenalan fungsi terperinci di bawah. 1. Pemerkasaan AI generatif yang mendalam Siri Samsung Galaxy S24 telah membawa banyak aplikasi pintar melalui pemerkasaan Galaxy AI Fungsi ini disepadukan secara mendalam dengan Samsung One UI6.1, membolehkan pengguna memperoleh pengalaman pintar yang mudah pada bila-bila masa, dengan ketara. meningkatkan prestasi telefon bimbit Kecekapan dan kemudahan penggunaan. Fungsi carian segera yang dipelopori oleh siri Galaxy S24 adalah salah satu sorotan Pengguna hanya perlu menekan dan menahan

Apa itu Dogecoin Apa itu Dogecoin Apr 01, 2024 pm 04:46 PM

Dogecoin ialah mata wang kripto yang dicipta berdasarkan meme Internet, tanpa had bekalan tetap, masa transaksi yang cepat, yuran transaksi yang rendah dan komuniti meme yang besar. Penggunaan termasuk transaksi kecil, petua dan sumbangan amal. Walau bagaimanapun, bekalan tanpa had, turun naik pasaran dan statusnya sebagai syiling jenaka juga membawa risiko dan kebimbangan. Apakah Dogecoin? Dogecoin ialah mata wang kripto yang dicipta berdasarkan meme dan jenaka internet. Asal dan Sejarah: Dogecoin dicipta pada Disember 2013 oleh dua jurutera perisian, Billy Markus dan Jackson Palmer. Diilhamkan oleh meme "Doge" yang popular ketika itu, gambar lucu yang memaparkan Shiba Inu dengan bahasa Inggeris yang rosak. Ciri dan Faedah: Bekalan Tanpa Had: Tidak seperti mata wang kripto lain seperti Bitcoin

See all articles