目录
一、音视频基础知识
1.1 介绍
音视频开发是当前驱动编程的核心之一 ,和摄像头有关
当前阶段主要会学习:视频的解码,音频的解码
1.2 视频
点成线,线成面 ,多个连续画面的切换 --- 视频
MCU 开发中的视频:动图
你需要将动图分割为一个一个的图片
图片依次取模,图片依次显示 --- 组成动图
视频是由一帧一帧的画面组成的
视频常见格式
mp4、mkv 等
视频是由图片组成的
常见的图片格式 --- jpg,png,bmp,jpeg 等等
在开发中显示的图片格式都是 --- RGB
屏幕的像素点组成是 RGB 三色灯
视频帧的格式
MJPEG、YUV(YUYV,YCbCr)
部分情况下称之为视频的原始格式、视频采集格式
视频帧的格式来自于视频采集设备
视频采集设备 --- 采集到的并不是 RGB 格式
视频采集设备
常见的就是:摄像头
在 Linux 系统中,有默认的摄像头开发方法
linux 中关于视频设备的内核驱动
V4L2
V4L2 是 Video for linux2 的简称,为 linux 中关于视频设备的内核驱动。在 Linux 中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/video 下,如果只有一个视频设备,通常为/dev/video0。V4L2 在设计时,是要支持很多广泛的设备的,它们之中只有一部分在本质上是真正的视频设备。
在嵌入式设备中,/dev/video 有好几个
在 ubuntu 下可以通过安装插件来使用摄像头
下载指令:sudo apt install cheese
执行指令:cheese
摄像头采集到的格式:在程序中通过 V4L2 的相关 API 进行获取
不同的视频图像格式支持的分辨率是不一样
不同的分辨率对应的视频帧数又是不同的
影响视频质量的参数
分辨率、帧率、图像格式
参数均和视频采集设备有关
采集设备决定了视频质量的参数
这些参数可以通过视频采集设备获取
YUV
YUV,是一种颜色编码方法。常使用在各个视频处理组件中。 YUV 在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。
Y'代表明亮度(luma;brightness)而 U 与 V 存储色度(色讯;chrominance;color)部分;亮度(luminance)记作 Y,而 Y'的 prime 符号记作伽玛校正。
U:表示蓝色
V:表示红色
Y′UV,YUV,YCbCr,YPbPr 所指涉的范围,常有混淆或重叠的情况。从历史的演变来说,其中 YUV 和 Y'UV 通常用来编码电视的模拟信号,而 YCbCr 则是用来描述数字的视频信号,适合视频与图片压缩以及传输,例如 MPEG、JPEG。但在现今,YUV通常已经在电脑系统上广泛使用。
主要在于应用场景区别
YUV 主要有三种格式:YUV444,YUV422,YUV420
YUV444 --- 一个 Y 分量占用一个 UV 分量
例如:仅作为理解
Y 分量占一个字节,U 分量占一个字节,V 分量占一个字节
4 个像素点需要 12 字节
YUV422 --- 两个 Y 分量占用一个 UV 分量
4 个像素点需要 8 字节
YUV420 --- 四个 Y 分量占用一个 UV 分量
4 个像素点需要 6 字节
压缩比率越来越高,相同的视频占用的空间越来越小
视频采集设备在采集之初就已经压缩了一次了,但是对于视频数据的传输和存储需要更高的压缩方式
视频帧 --- 必须记住
通过不同帧的大小缩减整体视频的大小
I 帧、P 帧、B 帧
I 帧:完全帧、关键帧 --- 包含了一帧图像的完整数据
P 帧:预测帧 --- 根据上一张图像的内容,来完成当前图像的显示
B 帧:双向帧、双向差别帧 --- 根据上一帧图像和下一帧图像,补全当前的图像
I、P、B 帧的大小依次越来越小
视频编码格式
视频的进一步压缩
H264、H265
H.264
我们是协议/标准的使用者,而不是制定者
同时也是 MPEG-4 第十部分,是由 ITU-T 视频编码专家组(VCEG)和 ISO/IEC 动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准。这个标准通常被称之为H.264/AVC(或者 AVC/H.264 或者 H.264/MPEG-4 AVC 或 MPEG-4/H.264 AVC)而明确的说明它两方面的开发者。
H.264 作为 MPEG-4 第十部分,由国际电联(ITU-T)的视频编码专家组(VCEG)与 ISO/IEC 的动态图像专家组(MPEG)共同推出的高度压缩数字视频编解码器标准,广泛应用于各种视频处理领域。而 H.265,即 HEVC(高效率视频编码),在 H.264 基础上进行了改进优化,包括码流、编码质量、延时等方面的提升,旨在提高压缩效率、增强鲁棒性和错误恢复能力,同时降低实时时延和复杂度。
最常遇到的面试问题:
H264 和 H265 之间的区别? --- 上面的区别
你为什么选择 H264/在使用上的区别?
H265 对硬件的要求更高,H264 在查找资料上要更占优势
移植、使用
移植:将需要的库,在 ubuntu 上通过交叉编译工具配置之后,将所需的库复制到开发板环境中
使用:程序的编译,运行
1.3 音频
常见的音频格式
mp3,wav,flac,aac 等,这些音频格式都是压缩过的音频格式了
音频的原始格式
PCM
脉冲编码调制(PulseCodeModulation),简称 PCM。是对连续变化的模拟信号进行抽样、量化和编码产生的数字信号。PCM 的优点就是音质好,缺点就是体积大。PCM 可以提供用户从 2M 到 155M 速率的数字数据专线业务,也可以提供话音、图象传送、远程教学等其他业务。PCM 有两个标准(表现形式):E1 和 T1。
现实生活中比较接近 PCM 的音频载体:黑胶唱片
影响音频质量的参数
音频采集设备和音频输出设备
音频采集设备 --- 麦克风/咪头
音频输出设备 --- 扬声器
查看自己的音频设备
音频采集设备:arecord -L
音频输出设备:aplay -L
影响音频质量的参数
声音对于采集设备来说是一个模拟量
采集设备需要将模拟量转为数字量 --- 进行存储
采样率:每秒钟采样音频的次数
8KHz、16KHz、44.1KHz、48KHz
采样数:确定多少次数据为一帧数据
1024、1152
对于很多的音频格式,使用 1024 会不支持
采样位数:8 位、16 位
声道数:双声道,单声道
音频的编码格式
AAC,G711A,MP2
AAC:AAC(Advanced Audio Coding),中文名:高级音频编码。出现于1997 年,基于 MPEG-2 的音频编码技术。由 Fraunhofer IIS、杜比实验室、AT&T、索尼等公司共同开发,目的是取代 MP3 格式。
G711A:G.711 是一种由国际电信联盟(ITU-T)制定的音频编码方式,又称为 ITU-T G.711。它是国际电信联盟 ITU-T 定制出来的一套语音压缩标准,它代表了对数 PCM(logarithmic pulse-code modulation)抽样标准,主要用于电话。它主要用脉冲编码调制对音频采样,采样率为 8k 每秒。它利用一个 64Kbps 未压缩通道传输语音讯号。起压缩率为 1:2, 即把 16 位数据压缩成 8 位。G.711 是主流的波形声音编解码器。
mp2,是 MPEG 音频文件,(MPEG-1 音讯部份)中订立之有损性音讯压缩格式。此标准还制订了 MPEG-1 Audio Layer I (MP1)和 MPEG-1 Audio Layer III (MP3)。个人电脑和互联网音乐流行 MP3,MP2 则多用于广播。
后续的 MP2 的音频和 H264 的视频共同合成一个音视频文件
Linux 下音频开发必要工具
ALSA
ALSA 是 Advanced Linux Sound Architecture 的缩写,高级 Linux 声音架构的简称,它在 Linux 操作系统上提供了音频和 MIDI(Musical Instrument DigitalInterface,音乐设备数字化接口)的支持。在 2.6 系列内核中,ALSA 已经成为默认的声音子系统,用来替换 2.4 系列内核中的 OSS(Open Sound System,开放声音系统)
1.4 软件编解码和硬件编解码
软件编解码:全靠 CPU 去算
硬件编解码:靠 GPU 或者 NPU 去计算
GPU --- 比较纯粹的渲染显示图像的
NPU --- 训练模型
人脸识别,行为识别,物品识别等等
硬件编解码的优点:快
软件编程码的优点:硬件编解码需要通过 API 去调用硬件设备
简单
二、FFMPEG
2.1 介绍
音视频开发会用到音视频专门的库文件
通用免费的:FFMPEG,SDL
嵌入式开发中还有不开源的:后续还会使用其中一个 --- RkMedia
2.2 FFMPEG 简介
FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用 LGPL 或 GPL 许可证。它提供了录制、转换以及流化音视频的完整解决方案。
官网 https://ffmpeg.org/ ,版本不同,FFMEPG 的 API 接口也不一定相同
2.3 FFMPEG 编译
必要库:sudo apt install yasm libx264-dev libsdl2-dev libmp3lame-dev libopus-dev libavdevice-dev libfdk-aac-dev
FFMPEG 通过参数的配置来选择不同的工作环境以及不同的应用场景
编译成功之后得到以下 4 个文件夹
其中 bin 就是可执行程序
lib 就是使用的赖库
让可执行程序在系统任何地方都可以起作用
ffmpeg:ffmpeg 中的核心指令
几乎除了播放,剩下的都可以用
ffplay:主要用来播放音视频
ffprobe:获取音视频文件的信息的 --- 极少用
配置库路径
2.4 FFMPEG 的应用
http://www.360doc.com/content/22/0724/11/9824753_1041178087.shtml