1、摄像头:
1)、对于不同的摄像头,有不同的接口方式,eg:USB,CMOS等,但是他们都遵循同样的标准-V4L2.
所以,不同的APP可以使用同样的API访问不同硬件接口的摄像头。
2)、摄像头参数:
分辨率:一幅图片的宽度和高度。
数据格式:RGB/YUV.JPEG/MJPEG…
帧率:一秒传多少张图片。
3)、应用程序通过V4L2接口采集视频数据的步骤:
参考博客:
①、打开视频设备文件,通过是视频采集的参数初始化,通过V4L2接口设置视频图像的属性。
注:我们可以指定摄像头的分辨率,但是指定的参数摄像头不一定支持。如果摄像头不支持,程序会默认选择和我们指定参数相近的参数,即硬件不一定支持传入的参数,它会把真正的参数传回来。
②、(APP)申请若干视频采集的帧缓冲区,并将这些帧缓冲区从内核空间映射到用户空间,便于应用程序读取、处理视频数据。此时,队列里都是空闲的、无数据的buffer。
③、将申请到的帧缓冲区在视频采集输入队列排队,并启动视频采集(都初始化结束,启动摄像头)。
④、驱动开始视频数据的采集,应用程序从视频采集输出队列取出帧缓冲区,处理后,将帧缓冲区重新放入视频采集输入队列,循环往复采集连续的视频数据。
扩展:②、③、④详解:
我们可以将这个过程用上图来描述:
a、在内核里面,有一个v4l2_buffer队列,里面放有很多个buffer.
b、驱动程序通过硬件获得数据以后,放到buffer.应用程序(APP)再将这些buffer拷贝出来,进行处理。
这个过程是这个样子,但是细节上还存在一些疑问:
1)、这些buffer是由谁来分配的,又是由谁来申请的?
答:
a、APP向内核申请若干个buffer。
b、APP把他们放入队列—》入列
c、驱动把数据放到buffer里面。放入以后,buffer的标记位就会标记,表示已经有数据了。
d、APP把有数据的buffer取出来(出列),进行处理。
e、buffer里面的数据处理结束以后,APP在将队列放回到buffer里面。
2)、驱动程序将数据放入到buffer里面,我们的应用程序(APP)是如何得到数据呢?
答:
我们可以使用copy函数(copy to user()),从内核里面把数据从内核里面的buffer拷贝到用户的的另一个buffer。但是这样会浪费时间!!
为了让应用程序直接访问内核里面的buffer,使用mmap,把内核里面buffer的地址直接映射给应用程序。这样,应用程序就可以直接访问内核里面的buffer。这就省去了一次拷贝。节省了时间和内存。
⑤、停止视频采集。
具体的实现过程如下:
注:
启动摄像头以后,可以使用select()来等待数据,他也属于是重复采集的一部分。
2、声卡ALSA(Advanced Linux Sound Architecture)先进的LINUX声音架构
我们使用ffmpeg来读取声音的时候,就是想将人类发出的声音作为数字信号读进去。
那么我们如何将模拟信号转换成数字信号呢?
电阻受声音影响,会发生变化,进而会导致电压的变化,通过记录电压来记录声音。
为保证“数字化声音”的精度,我们提出两个指标:
1)、采样频率:一秒内采样次数越多,声音越逼真。但是也不用太高,人耳分辨不出更高的频率。
2)、数据位宽:位数越多,记录的电压值越精确,声音精度越高。通常是16bit。
参考博客:
3)、在声音的采集部分,还有第三个参数:声道。
声道:要声音听起来有空间感,至少要有左、右两声道。
简单地说,录制声音时,模拟左、右耳朵的位置放置两个ADC采集声音
播放时,两个耳机的声音不一样
3、声卡接口
对声音的编解码比较简单,不太消耗cpu资源。但是,ALSA的API接口,及其复杂。复杂之
处在于有很多的ioctl来设置很多的参数。
所以,一般都是基于ALSA-LIB来编写app。(调用库)
ALSA app的伪代码如下:
1)、打开设备
2)。设置参数
3)、进入循环。循环读取声音;将声音发送给声卡,播放声音。
4)、关闭设备。
关于应用程序,参考博客:
http://www.equalarea.com/paul/alsa-audio.html
4、在开发板实现让FFmpeg录制声音
1)、FFmpeg借助alsa-utils操作声卡
使用Buildroot,配置选择alsa-utils,直接编译生成映象文件
rm -rf output/build/ffmpeg-3.4.5
make
2)、运行FFmpeg:
只是录制声音:
在开发板上执行: ffmpeg -f alsa -ac 1 -i hw:0,0 my.wav(使用一个声道;使用第0个声卡里面的第0个设备;音频文件保存在my.wav,音频格式是wav)
此时,就可以对着耳机说话,声音就可以被录制下来。
播放:
aplay my.wav
5、流媒体的测试
推流:
在开发板上执行:
只推声音:ffmpeg -f alsa -ac 1 -ar 11025 -i hw:0,0 -acodec aac -f flv rtmp://127.0.0.1/live/wei (ar:表采样频率;将采集到的音频使用aac编码;复用进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
拉流:
在PC上安装VLC播放器:https://www.videolan.org/
使用RTMP协议拉流:VLC播放器中点击“媒体”->“打开网络串流”,输入:rtmp://10.3.78.33/live/wei ,就可以播放了
使用HTTPFLV协议拉流:VLC播放器中点击“媒体”->“打开网络串流”,输入: http://10.3.78.33/test?app=live&stream=wei ,就可以播放了。