UVC&UAC 总结

目的:

基于hisi3521Dv200,实现UAC,UVC音视频采集,并通过海思进行解码播放

一、什么是UAC UVC ?

UVC全称为USB Video Class,即:USB视频类,是一种为USB视频捕获设备定义的协议标准。是Microsoft与另外几家设备厂商联合推出的为USB视频捕获设备定义的协议标准,已成为USB org标准之一。

UAC全称为USB Audio Class,即:USB频类

ALSA是Advanced Linux Sound Architecture的缩写,高级Linux声音架构的简称,它在Linux操作系统上提供了音频和MIDI(Musical Instrument Digital Interface,音乐设备数字化接口)的支持。

UVC&UAC 总结_第1张图片

V4L2是Video for linux2的简称,为linux中关于视频设备的内核驱动。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/video*下,如果只有一个视频设备,通常为/dev/video0。

V4L2在设计时,是要支持很多广泛的设备的,它们之中只有一部分在本质上是真正的视频设备。

UVC&UAC 总结_第2张图片

二、UAC、UVC环境准备

2.1 kernel配置

 见文档 海思3521dv200_uvc_uac_config

2.2 ALSA第三方库安装

1、下载alsa Linux安装包

地址:v4l-utils.git - media (V4L2, DVB and IR) applications and libraries

下载文件:alsa-lib-1.2.4.tar.bz2

2、解压压缩包 tar -xvf alsa-lib-1.2.4.tar.bz2

3、在alsa-lib中,函数 snd_config_topdir 用于获取配置文件的路径,有两个方法可以进行配置:

  1. 使用环境变量 ALSA_CONFIG_DIR 进行配置。
  2. 在生成configure时,使用--with-configdir=dir 进行配置。

默认的路径为 $prefix/share/alsa

./configure --prefix=${PWD}/build/ CC=arm-himix410-linux-gcc CFLAGS='-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -fno-aggressive-loop-optimizations -fPIC' --host=arm-linux --enable-static --disable-shared

make install

编译安装成功会在当前目录生成build文件目录,目录中的头文件以及库都是编译好的依赖的第三方文件

UVC&UAC 总结_第3张图片

三、UVC采集流程

  一、打开视频设备文件,进行视频采集的参数初始化,通过V4L2接口设置视频图像的采集窗口、采集的点阵大小和格式;

  二、申请若干视频采集的帧缓冲区,并将这些帧缓冲区从内核空间映射到用户空间,便于应用程序读取/处理视频数据;

  三将申请到的帧缓冲区在视频采集输入队列排队,并启动视频采集;

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

  五停止视频采集

UVC&UAC 总结_第4张图片

四、UAC采集流程

一、打开音频设备节点 /dev/pcmC0D0c

二、获取支持的音频集信息(单/双声道,采样率,采样位数等)

三、设置音频采样信息(单/双声道,采样率,采样位,period_size,period_time等)

  二、申请音频采集的帧缓冲区,控制线程循环读取音频数据,对音频数据进行处理(语音处理而言8K采样率便足够,若高于8K,丢弃数据使之转换成8K采样率。中间件只处理单声道数据,一帧上双声道数据转换为单声道数据处理方法:左声道数据加上右声道数据除以2,采样率转换方法:抽样保留,即16K则每2帧传一帧上去,32K则每4帧传一帧上去)

  五停止音频采集

UVC&UAC 总结_第5张图片

 UVC&UAC 总结_第6张图片

  • 海思解码输出

5.1、UVC 采集到YUV 流

暂无,YUV格式数据量太大,usb2.0数据传输速率太慢,未采用此格式

5.2、UVC 采集到MJPEG 流

hl_sys_init初始化

UVC&UAC 总结_第7张图片

Vdec init

UVC&UAC 总结_第8张图片

5.3、UAC 采集到PCM流(单声道)

UVC&UAC 总结_第9张图片

1、Adec_start 开启2路音频解码通道

UVC&UAC 总结_第10张图片

2、创建通道参数需要配置成LPCM所需格式

UVC&UAC 总结_第11张图片

3、设置ao参数(单声道,48k采样率)

UVC&UAC 总结_第12张图片

4、设置重采样参数信息

UVC&UAC 总结_第13张图片

  1. ao反初始化,adec反初始化 (略)
  • 遇到的问题
  1. alsa第三方库安装

configure 配置

2、alsa音频库依赖alsa.conf报错

问题原因&解决:alsa启动需要依赖alsa.conf文件,需要把share目录的所有文件都放入文件系统,且路径不能错。

UVC&UAC 总结_第14张图片

遗留问题:alsa.conf所在路径是绝对路径,如何改成灵活的相对路径?(可指定配置文件路径)

  1. 音频重采样库依赖,编译能通过,但是在开发板上运行,却报错找不到 libhive_RES.so,

已知同样环境下海思sample可以正常运行,能够找到libhive_RES.so。

UVC&UAC 总结_第15张图片

解决办法:临时方法(编译时加入动态库libhive_RES.so依赖路径,运行时将libhive_RES.so放在相应的绝对路径)

参考资料:

和菜鸟一起学linux之V4L2摄像头应用流程_东月之神-CSDN博客_linux v4l2

V4L2_百度百科

V4L2视频采集原理 - 怀想天空_2013 - 博客园

ALSA【一】_月雲之霄的博客-CSDN博客_alsa

https://blog.csdn.net/MyArrow/article/details/8230231?utm_source=blogxgwz9

你可能感兴趣的:(嵌入式LINUX,音视频,linux,运维,uac,arm)