我们如果用程序怎么操作摄像头操作声卡呢
参考第二节的视频,mjpg-streamer库里面查看v4l2uvc.c就可以快速掌握摄像头
不是你是cmos还是什么类型的摄像头,我们的应用程序都可以用一套程序访问不同的硬件摄像头!
API接口:
我们猜想过程如下:
(1)设置格式
设置分辨率,设置像素的格式,设置帧率
1024*768 如果硬件不支持会返回一个相近的参数返回给你
(2)启动摄像头
(3)获得数据 (循环过程)
(4)停止
ioctl就是控制硬件的,可以发一些命令给他,启动或返回一些信息
查询能力就是有些摄像头驱动提供读写函数,可以通过read函数读信息,但有些摄像头驱动并不提供read函数
需要mmap来映射摄像头的buffer,通过这个返回的值查看支持那些方式
如果不支持摄像头,返回适合的分辨率
关系如何读buffer
弄清这张图,对于摄像头的读取就可以彻底掌握了
1.App想要多少个buffer,向内核申请
2.App把他们放入队列
3.驱动把数据放入某个buffer
4.应用程序把该buffer从队列出列,处理数据
5.处理完再把buffer入列
应用程序可以用copy_to_user把数据从内核拷贝到应用程序去,但是这浪费时间,能不能直接访问内核的buffer
可以通过mmap把这个地址映射给应用程序,应用程序可以直接访问内核的buffer,这样就节省了拷贝的时间
对应应用程序,请求buffer
应用程序映射内核buffer
buffer放入队列
启动摄像头,用select或者poll函数等待数据
这是一个循环过程:
我们决定不在使用摄像头的时候可以ioctl关闭
imput_uvc.c中
打开设备,xioctl实际就是ioctl,可能为了兼容这么写
判断那种方法获得数据,是stream还是read
设置摄像头格式,如果和预期不一样,则把支持的参数写会结构体
底下就是摄像头支持的格式了:
设置帧率
申请buffer
申请成功后,映射buffer
buffer放入队列
在cam_thread.c中对应肯定要读摄像头的数据
enable启动摄像头
steamon启动它
然后就是循环
用select检测摄像头
使用uvcGrab获取一帧,到这里就已经有数据了
把队列里面的数据取出来
把摄像头的数据拷到临时的buffer里面
再把内核里面的buffer数据重新放回队列里面
通常使用alsa-lib来使用
linux中声卡驱动成为ALSA
Linux中声卡的驱动成为ALSA:Advanced Linux Sound Architecture
ALSA意思是先进的linux架构
里面的ioctl太复杂了,通常用alsa-lib编写程序
我们通过alsa-utils录制声音,alsa-utils用的就是alsa-lib
进入buildroot下make menuconfig
make
可能配置不起作用把ffmpeg删掉。
录制声音:
ffmpeg -f alsa -ac 1 -i hw:0,0 test.wav
播放声音:
alpay test.wav
alsa里面有arecode比ffmpeg要好用的多
arecode --help
当然我们想要把声音推流
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协议推送出去
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
我这边插上耳机通过耳机的耳麦说话并且通过摄像头可以正常在播放器下看到图像听到声音啦!