正点原子imx6ull开发板视频监控项目实战系列5: 摄像头(V4L2)和声卡(ALSA)接口简介

1、摄像头:

1)、对于不同的摄像头,有不同的接口方式,eg:USB,CMOS等,但是他们都遵循同样的标准-V4L2.
所以,不同的APP可以使用同样的API访问不同硬件接口的摄像头。
2)、摄像头参数:
分辨率:一幅图片的宽度和高度。
数据格式:RGB/YUV.JPEG/MJPEG…
帧率:一秒传多少张图片。
3)、应用程序通过V4L2接口采集视频数据的步骤:
参考博客:https://blog.youkuaiyun.com/simonforfuture/article/details/78743800
①、打开视频设备文件,通过是视频采集的参数初始化,通过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。
在这里插入图片描述
参考博客:
https://blog.youkuaiyun.com/sanmaoljh/article/details/51134845?ops_request_misc=&request_id=&biz_id=102&utm_term=ALSA%25E5%25B7%25A5%25E4%25BD%259C%25E5%258E%259F%25E7%2590%2586&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-6-51134845.nonecase
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 ,就可以播放了。

### V4L2ALSA 的音视频处理及配置 #### V4L2 概述 V4L2 (Video for Linux Two) 是 Linux 下用于多媒体设备的标准接口,主要用于捕获和回放视频。其核心组件位于 `drivers/media/v4l2-core` 文件夹下[^2]。 - **videobuf2_xx 系列文件**:负责视频缓冲区的管理和分配。 - **v4l2-device.c**:实现了 `v4l2_device` 结构体及其操作函数,这是 V4L2 设备的核心部分之一。 - **v4l2-subdev.c**:提供子设备的支持,允许复杂的摄像机模块被分解成多个独立的部分来管理。 这些特性使得 V4L2 成为了一个强大而灵活的工具,在各种嵌入式系统中广泛应用。 #### ALSA 概述 ALSA (Advanced Linux Sound Architecture) 提供了一套完整的 API 来访问声硬件资源。它不仅支持基本的声音播放与录音功能,还包括 MIDI 控制等功能。对于音频采集来说,主要依赖于 alsa-lib 库中的 PCM 接口来进行实际的数据读取工作[^1]。 #### 配置方法 ##### 安装必要的软件包 确保安装了最新的 FFmpegalsa-utils 及 libavdevice 开发库: ```bash sudo apt-get update && sudo apt-get install ffmpeg alsa-utils libavdevice-dev ``` ##### 编写简单的 C/C++ 测试程序 下面是一个简单例子展示如何通过命令行调用 FFmpeg 实现摄像头获取图像保存为 MP4 文件的功能: ```c #include <libavformat/avformat.h> int main(int argc, char *argv[]) { av_register_all(); AVFormatContext *pFormatCtx; // 打开输入设备 if(avformat_open_input(&pFormatCtx,"/dev/video0",NULL,NULL)!=0){ printf("Couldn't open input stream.\n"); return -1; } } ``` 此代码片段仅作为演示用途;要完成整个流程还需要添加更多逻辑以初始化参数设置、创建输出容器以及执行具体的编码任务等。 ##### 使用 GStreamer 或其他高级框架简化开发 如果不想深入底层细节,则可以选择像 GStreamer 这样的高层次多媒体处理框架。GStreamer 能够轻松集成 V4L2ALSA 功能,且拥有丰富的插件生态系统可供选择。 例如,可以通过以下命令快速搭建一条管道,将来自 USB 摄像头的画面转码后上传至 RTMP 服务器: ```bash gst-launch-1.0 v4l2src device=/dev/video0 ! x264enc ! flvmux ! rtmpsink location='rtmp://server/live/stream' ``` 上述指令展示了怎样利用 GStreamer 构建起一套简易却高效的直播解决方案[^3]。 #### 常见问题排查技巧 当遇到无法正常启动或性能不佳等问题时,建议先检查以下几个方面: - 确认所使用的驱动版本是否最新; - 查看 dmesg 日志是否有异常报告; - 尝试调整应用程序内部的相关参数设定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

One Piece&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值