100ask_imx6ull视频监控项目-摄像头和声卡编程(五)

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)

我们如果用程序怎么操作摄像头操作声卡呢

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第1张图片

参考第二节的视频,mjpg-streamer库里面查看v4l2uvc.c就可以快速掌握摄像头

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第2张图片

不是你是cmos还是什么类型的摄像头,我们的应用程序都可以用一套程序访问不同的硬件摄像头!

API接口:

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第3张图片

我们猜想过程如下:

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第4张图片

(1)设置格式

设置分辨率,设置像素的格式,设置帧率

1024*768 如果硬件不支持会返回一个相近的参数返回给你

(2)启动摄像头

(3)获得数据 (循环过程)

(4)停止

1.API具体实现过程:

(1)查询摄像头

ioctl就是控制硬件的,可以发一些命令给他,启动或返回一些信息

在这里插入图片描述

查询能力就是有些摄像头驱动提供读写函数,可以通过read函数读信息,但有些摄像头驱动并不提供read函数

需要mmap来映射摄像头的buffer,通过这个返回的值查看支持那些方式

(2)设置格式

在这里插入图片描述

如果不支持摄像头,返回适合的分辨率

(3)如何处理buffer

关系如何读buffer

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第5张图片

弄清这张图,对于摄像头的读取就可以彻底掌握了

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第6张图片

1.App想要多少个buffer,向内核申请

2.App把他们放入队列

3.驱动把数据放入某个buffer

4.应用程序把该buffer从队列出列,处理数据

5.处理完再把buffer入列

应用程序可以用copy_to_user把数据从内核拷贝到应用程序去,但是这浪费时间,能不能直接访问内核的buffer

可以通过mmap把这个地址映射给应用程序,应用程序可以直接访问内核的buffer,这样就节省了拷贝的时间

对应应用程序,请求buffer

在这里插入图片描述

应用程序映射内核buffer

在这里插入图片描述

buffer放入队列

在这里插入图片描述

启动摄像头,用select或者poll函数等待数据

在这里插入图片描述

这是一个循环过程:

在这里插入图片描述

我们决定不在使用摄像头的时候可以ioctl关闭

在这里插入图片描述

2.代码实现过程:

imput_uvc.c中

在这里插入图片描述

打开设备,xioctl实际就是ioctl,可能为了兼容这么写

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第7张图片

判断那种方法获得数据,是stream还是read

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第8张图片

设置摄像头格式,如果和预期不一样,则把支持的参数写会结构体

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第9张图片

底下就是摄像头支持的格式了:

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第10张图片

设置帧率

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第11张图片

申请buffer

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第12张图片

申请成功后,映射buffer

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第13张图片

buffer放入队列

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第14张图片

在cam_thread.c中对应肯定要读摄像头的数据

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第15张图片

enable启动摄像头

在这里插入图片描述

steamon启动它

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第16张图片

然后就是循环

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第17张图片

用select检测摄像头

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第18张图片

使用uvcGrab获取一帧,到这里就已经有数据了

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第19张图片

把队列里面的数据取出来

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第20张图片

把摄像头的数据拷到临时的buffer里面

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第21张图片

再把内核里面的buffer数据重新放回队列里面

3.声音的采集

通常使用alsa-lib来使用

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第22张图片

linux中声卡驱动成为ALSA

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第23张图片

Linux中声卡的驱动成为ALSA:Advanced Linux Sound Architecture

ALSA意思是先进的linux架构

里面的ioctl太复杂了,通常用alsa-lib编写程序

4.编译alsa-utils

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第24张图片

我们通过alsa-utils录制声音,alsa-utils用的就是alsa-lib

进入buildroot下make menuconfig

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)_第25张图片

make

可能配置不起作用把ffmpeg删掉。

录制声音:

ffmpeg -f alsa -ac 1 -i hw:0,0 test.wav

播放声音:

alpay test.wav

alsa里面有arecode比ffmpeg要好用的多

arecode --help

当然我们想要把声音推流

(1)只推声音

ffmpeg -f alsa -ac 1 -ar 11025 -i hw:0,0 -acodec aac -f flv rtmp://127.0.0.1/live/wei

ac 通道:1

ar采样频率:11025

把采样到的数据采用aac编码 封包-f 复用进flv格式里面 用rtmp协议推送出去

(2)视频声音一起推

ffmpeg -f alsa -ac 1 -ar 11025 -i hw:0,0 -acodec aac -f v4l2 -framerate 10 -i /dev/video1 -q 10 -f flv rtmp://127.0.0.1/live/wei

我这边插上耳机通过耳机的耳麦说话并且通过摄像头可以正常在播放器下看到图像听到声音啦!

你可能感兴趣的:(imx6ull)