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

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

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

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

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

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

API接口:

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

我们猜想过程如下:

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

(1)设置格式

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

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

(2)启动摄像头

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

(4)停止

1.API具体实现过程:

(1)查询摄像头

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

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

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

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

(2)设置格式

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

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

(3)如何处理buffer

关系如何读buffer

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

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

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

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

2.App把他们放入队列

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

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

5.处理完再把buffer入列

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

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

对应应用程序,请求buffer

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

应用程序映射内核buffer

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

buffer放入队列

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

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

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

这是一个循环过程:

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

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

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

2.代码实现过程:

imput_uvc.c中

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

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

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

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

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

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

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

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

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

设置帧率

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

申请buffer

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

申请成功后,映射buffer

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

buffer放入队列

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

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

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

enable启动摄像头

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

steamon启动它

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

然后就是循环

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

用select检测摄像头

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

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

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

把队列里面的数据取出来

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

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

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

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

3.声音的采集

通常使用alsa-lib来使用

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

linux中声卡驱动成为ALSA

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

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

ALSA意思是先进的linux架构

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

4.编译alsa-utils

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

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

进入buildroot下make menuconfig

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

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

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

相关文章:

  • 2022-12-23
  • 2022-01-30
  • 2021-08-07
  • 2021-06-12
  • 2021-05-20
  • 2021-09-09
  • 2022-01-16
  • 2021-06-27
猜你喜欢
  • 2021-07-28
  • 2022-12-23
  • 2021-10-13
  • 2022-12-23
  • 2021-11-18
  • 2021-10-13
  • 2021-12-05
相关资源
相似解决方案