音视频入门基础知识

1.音视频录制与播放原理

首先对于音频的录制来说,我们首先要通过一定的采样频率来获取到采样帧,然后对音频进行处理后进入到采样帧队列,然后通过编码处理(包括压缩等)后形成一个音频包队列。对于视频的录制来说,我们也要先通过一定采用频率来获取图像帧,然后对图像进行处理进入到图像帧队列,然后通过编码处理(其中也包括压缩等)后形成一个视频包队列。最后将音频包和视频包通过复用器合成我们的音视频文件。详情见下图:

其中的时钟对于采样帧和图像帧的采用很重要,且两者一般共用一个时钟源,来保证后续的音频同步。然后对于音频的播放,一般就是音视频录制的一个逆过程,如下图:

首先我们可以看到我们的文件通过解复用器后就将媒体文件转化成了一个音频包队列和一个视频包队列,然后通过音频和视频解码将编码的包解码成对应的帧放入到对应队列当中,通过同步控制将音视频播放同步,然后我们就可以对其进行音频处理和图像处理,音频处理可以对音频进行一定的音调音量处理,图像处理的则可以进行一些亮度色彩的调节等。

2.视频基础知识

对于视频来说,是由一帧帧的图像连续显示得到的,那么我们先来了解一些图像的基本知识。像素是一个图片的基本单位,我们常说的就有如2500x2000照片,即横向有2500个像素点纵向有2000个像素点,即该照片有500万像素。图片的分辨率指的是图片的大小或尺寸,比如我们常见的有720P(1280x720),1080P(1920x1080),4K(3840x2160),8K(7680x4320)分辨率,分辨率越高图像就越清晰。通常我们所见的彩色图片都是由RGB三通道组成,一般我们每个通道用的是8bit来表示即256中颜色,可以组成256*256*256种颜色,当然我们还可以用其他bit来表示,越多可以组成的颜色就越多,其中8bit就是位深。帧率即FPS,即我们前面学习lvgl时通过lvgl库中调用出的显示界面下的FPS就是帧率,帧率越高画面就会越流畅,当然需要的设备性能要求也越高。码率指的是单位时间内视频文件使用的数据流量,通常其他相同码率越高视频也就也清晰。RGB是一种加色法的色彩模型,通常一个像素点由一组RGB排列而成。YUV则是一种将亮度参量和色度参量分开进行表示的像素编码格式,优点就是将图像与色彩分开,没有UV分量同样也开始显示图像,降低了色度的采样率,降低了视频传输时对频宽带宽的要求,更加便于存储和高效传输。YUV按照排列方式可以分为打包格式(packed)和平面格式(planar),对于打包格式来说其将每个像素点的YUV分量交叉排列并以像素点为单元连续存放在同一数组中,平面格式则使用三个数组分开存放YUV三个分量。如下图所示:

YUV按照YUV采样频率的比例来分则主要分为YUV4:4:4,YUV4:2:2,YUV4:2:0三种。YUV4:4:4表示的是一个Y分量对应一个U和V分量,YUV4:2:2表示两个Y分量共用一个U和V分量,YUV4:2:0表示4个Y分量共用一个U和V分量。如下图所示:

然后我们接着对444格式和422格式和420格式的进行具体描述,对于平面格式YUV444P格式对应ffmpeg像素表示为AV_PIX_FMT_YUV444P,YUV442P格式在ffmpeg像素表示为AV_PIX_FMT_YUV422P,YUV420P格式在ffmpeg像素表示为AV_PIX_FMT_YUV420P图形表示,也分别称为I444,I422,I420,还有一种格式叫NV12,分别如下图所示:

接着就是YUV的步幅对齐问题,若我们图片的分辨率是638x480在内存处理时要以16字节对齐即Y分量要被16整除所以要给638加上2,对于UV分量要是若是后面几个格式则要加上1。接下来我们来看看与视频相关的一些概念的讲解,视频码率(kb/s)指的是视频文件在单位时间内使用的数据流量也叫流码率,码率越大单位时间内的取样率就越大,数据流精度就越高。视频帧率(fps)我们通过说的一个视频多少帧多少帧,指的就是视频帧率,帧率越高视觉上就越流畅。视频分辨率通常就是我们说到720p1080p等,分辨率影响视频图像大小。I-P-B帧,I帧编码时不需要参考其他图像生成解码时靠自己就可以恢复出完整图像,I帧占有的信息量较大,是P帧和B帧的参考帧。P帧根据本帧与前一帧I帧或P帧来压缩本帧数据,其解码需要参考前一帧的I帧或P帧。B帧采用双向时间预测,压缩时可以大大加大压缩率。常用的压缩算法有:MPEG2压缩,H264压缩,H265,AVS,VP8,VP9等。

3.音频基础知识

声音是由物体的振动形成的,通过振动就产生了波形。我们来看看其的一些概念,声音的频率是1秒钟内的周期数多少HZ就表示每秒钟振动多少次,我们知道人耳能听到声音的频率范围是20hz到20khz。声音的振幅即波形的幅度,表现为人们听到的声音的大小。我们知道声音在自然中是模拟量我们要想在用数字设备处理音频的话就要将其转化为数字量,而我们学过模拟量转化为数字量的基本要素就是采样频率,量化,编码。我们知道奈奎斯特采样定理表示:为了从采样后的数字信号中共无失真地,完全的重建原始模拟信号,采样频率fs必须是原始信号中最高频率fmax地两倍。即fs>=2*fmax.对于例如CD音质的采样标准就是44.1khz,意味着每秒采样44100次。采样精度指每个样本点的大小,通常有8bit,16bit,24bit等。通道数有单声道,双声道,四声道,5.1声道也就是立体声。音频在传输过程中的概念,比特率,指的是每秒传输的bit数,单位是bps,间接衡量一个声音质量的标准。没有压缩的音频数据的比特率等于采样频率*采样精度*通道数。码率指的是压缩后音频数据的比特率,码率越大压缩效率越低音质越好压缩后的数据越大,码率等于音频文件的大小除以时长。帧指的是每次编码采样单元数,帧长指每帧播放的时长,每帧持续的是时长等于每帧采样点数除以采样频率。数字音频信号存储的方式有交错模式和非交错模式,交错模式先记录一帧的左声道在记录右声道,非交错模式先记录一个周期内的左声道再记录一个周期内的右声道。如下图:

前面我们讲到了比特率的计算方法,我们通过该计算方法计算一个音频的不经过压缩时传输的码率可见非常大,所以我们就要对该音频进行压缩了。数字音频压缩编码规则就是在保证音频在听觉下不失真的条件下尽可能地压缩减少数据量,采取去除声音中地冗余成分来实现压缩。在人听觉范围外的和被掩蔽的信号都市冗余的成分,声音信号的掩蔽通常表示在频谱掩蔽效应和时域掩蔽效应。频域掩蔽效应如图所示:

在该图中可知在曲线下方的区域都是被掩蔽的声音,可见人们对于1到10kh左右频率的信号比较敏感,当突然某个频率的声音声强很大时,其附近范围掩蔽阈值就会上升更多的声音被掩蔽,这些被掩蔽的声音在压缩时都可以将其去除。对于时域掩蔽效应如下图所示:

可见当某段时间内出现一个声音强度较大的声音时,其前面的声音和后面的声音都有或多或少被掩蔽掉,在该高声强时间段内出现的低强声音也会被掩蔽掉,这些被掩蔽掉的声音我们也可以将其去除。对于音频的编解码器我们常见的有OPUS,MP3,AAC,AC3和EAC3。OPUS常用于语音通话,MP3常用于音乐方面,AAC常用于直播中。

4.音视频的常用封装格式

音视频封装格式(也叫容器格式 )的作用是将音频流视频流字幕流等多个轨道打包成一个文件,方便存储和传输。它不负责编码压缩音视频数据,只负责整合和管理这些数据流。音视频中常见的封装格式有:MP4,MKV,AVI,MOV,FLV,WMV,TS,WebM等。可以根据不同的场景进行选择如:

  • 追求兼容性 → 选 MP4
  • 追求多音轨 / 多字幕 / 高清 → 选 MKV
  • 专业影视后期 → 选 MOV(ProRes 编码)
  • 直播 / 流媒体传输 → 选 TS
  • 网页端轻量化播放 → 选 WebM

对于封装来收音视频同步也是非常的,DTS指的是解码时间戳,该的意义是告诉播放器在什么时候解码这帧数据,PTS指的是显示时间戳,该用来告诉播放器什么时候用来显示这帧数据。同步的策略有以音频为基准,视频为基准,时钟为基准,其中以音频为基准最常用。

相关推荐
CoderYanger2 小时前
C.滑动窗口-求子数组个数-越短越合法——3134. 找出唯一性数组的中位数
java·开发语言·数据结构·算法·leetcode
_OP_CHEN2 小时前
【算法基础篇】(二十八)线性动态规划之基础 DP 超详解:从入门到实战,覆盖 4 道经典例题 + 优化技巧
算法·蓝桥杯·动态规划·运筹学·算法竞赛·acm/icpc·线性动态规划
ckhcxy2 小时前
继承和多态(二)
java·开发语言
ndzson2 小时前
从前序与中序遍历序列构造二叉树 与
数据结构·算法
raoxiaoya2 小时前
用golang开发AI Agent项目,有哪些框架可以选择
开发语言·人工智能·golang
老王熬夜敲代码2 小时前
ref关键字
开发语言·c++
m0_738120722 小时前
渗透测试——靶机Sar1渗透横向详细过程
开发语言·python·安全·web安全·网络安全·ssh·php
山峰哥2 小时前
现代 C++ 的最佳实践:从语法糖到工程化思维的全维度探索
java·大数据·开发语言·数据结构·c++
CoderYanger2 小时前
动态规划算法-两个数组的dp(含字符串数组):43.不同的子序列
java·算法·leetcode·动态规划·1024程序员节