1、摄像头:

1)、对于不同的摄像头,有不同的接口方式,eg:USB,CMOS等,但是他们都遵循同样的标准-V4L2.

所以,不同的APP可以使用同样的API访问不同硬件接口的摄像头。

2)、摄像头参数:

分辨率:一幅图片的宽度和高度。

数据格式:RGB/YUV.JPEG/MJPEG…

帧率:一秒传多少张图片。

3)、应用程序通过V4L2接口采集视频数据的步骤:

参考博客:

①、打开视频设备文件,通过是视频采集的参数初始化,通过V4L2接口设置视频图像的属性。

注:我们可以指定摄像头的分辨率,但是指定的参数摄像头不一定支持。如果摄像头不支持,程序会默认选择和我们指定参数相近的参数,即硬件不一定支持传入的参数,它会把真正的参数传回来。

②、(APP)申请若干视频采集的帧缓冲区,并将这些帧缓冲区从内核空间映射到用户空间,便于应用程序读取、处理视频数据。此时,队列里都是空闲的、无数据的buffer。

③、将申请到的帧缓冲区在视频采集输入队列排队,并启动视频采集(都初始化结束,启动摄像头)。

④、驱动开始视频数据的采集,应用程序从视频采集输出队列取出帧缓冲区,处理后,将帧缓冲区重新放入视频采集输入队列,循环往复采集连续的视频数据。

扩展:②、③、④详解:

Hikaricp连接数 监控 al-cam监控 连接_ffmpeg


我们可以将这个过程用上图来描述:

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。这就省去了一次拷贝。节省了时间和内存。

⑤、停止视频采集。

具体的实现过程如下:

Hikaricp连接数 监控 al-cam监控 连接_ffmpeg_02


注:

启动摄像头以后,可以使用select()来等待数据,他也属于是重复采集的一部分。

2、声卡ALSA(Advanced Linux Sound Architecture)先进的LINUX声音架构

我们使用ffmpeg来读取声音的时候,就是想将人类发出的声音作为数字信号读进去。

那么我们如何将模拟信号转换成数字信号呢?

电阻受声音影响,会发生变化,进而会导致电压的变化,通过记录电压来记录声音。

为保证“数字化声音”的精度,我们提出两个指标:

1)、采样频率:一秒内采样次数越多,声音越逼真。但是也不用太高,人耳分辨不出更高的频率。

2)、数据位宽:位数越多,记录的电压值越精确,声音精度越高。通常是16bit。

Hikaricp连接数 监控 al-cam监控 连接_Hikaricp连接数 监控_03


参考博客:

3)、在声音的采集部分,还有第三个参数:声道。

声道:要声音听起来有空间感,至少要有左、右两声道。

简单地说,录制声音时,模拟左、右耳朵的位置放置两个ADC采集声音

播放时,两个耳机的声音不一样

Hikaricp连接数 监控 al-cam监控 连接_ffmpeg_04

3、声卡接口

对声音的编解码比较简单,不太消耗cpu资源。但是,ALSA的API接口,及其复杂。复杂之

处在于有很多的ioctl来设置很多的参数。

所以,一般都是基于ALSA-LIB来编写app。(调用库)

ALSA app的伪代码如下:

Hikaricp连接数 监控 al-cam监控 连接_ffmpeg_05


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 ,就可以播放了。