前阵子写了很多笔记,由于忙于研究生课程学习,故很少有时间整理笔记分享到公众号上,今天整理的笔记是我之前学习音视频技术相关的笔记整理。
1、视频
1.1、视频帧
帧,是视频的一个基本概念,表示一张画面,一个视频就是由许许多多的帧组成的。
1.2、帧率
即单位内帧的数量,单位为:帧/秒 或 fps
(frames per second
),一秒内包含多少张图片,图片越多,画面越顺滑,过渡越自然。
常见的帧率典型值:
(1)24/25 fps
:1秒24/25帧,一般的电影频率。
(2)30/60 fps
:1秒30/60帧,游戏的频率,30帧可以接受,60帧会感觉更加流畅逼真
(3)85fps
:这个帧率及以上人眼基本无法察觉出来,更高的帧率在视频里没有太大意义。
2、色彩空间
2.1、RGB
通过R、G、B三种基础色,可以混合出所有的颜色
2.2、YUV
也叫,YCbCr
,是一种亮度与色度分离的色彩格式
(1)Y:亮度,就是灰度值,出了表示亮度信号外,还含有较多的绿色通道量
(2)U:蓝色通道与亮度的差值
(3)V:红色通道与亮度的差值
优势:
人眼对亮度敏感,对色度不敏感,因此减少部分UV的数据量,人眼却无法感知出来,这样可以通过压缩UV分辨率,在不影响感观的前提下,减少视频的体积。
2.3、RGB
与YUV
的换算
(1)RGB
转YUV
算法
Y = 0.299R
+ 0.587G
+ 0.114B
U = -0.147R
- 0.289G
+ 0.436B
V = 0.635R
- 0.515G
- 0.100B
(2)YUV
转RGB
算法
R = Y + 1.14V
G = Y - 0.39U
- 0.58V
B = Y + 2.03U
3、音频
3.1、基本知识
人类能够听到的所有声音都称之为音频,在计算机中,音频只是存储在计算机里的声音。
PCM
:音频数据的承载方式最常用的是脉冲编码调制。
在自然界中,声音是连续不断的,是一种模拟信号,那怎样才能把声音保存下来呢?就是将这些模拟信号数字化,即模数转换,将模拟信号转换为数字信号。
声音是一种波,由自己的振幅和频率,那么要保存声音,就要保存声音在各个时间点上的振幅。而数字信号并不能连续保存所有时间点的振幅。
奈奎斯特采样定理:为了不失真地恢复模拟信号,采样频率应该不小于模拟信号频率中最高频率的2倍。
3.2、采样率和采样位数
(1)采样率
根据奈奎斯特采样定理,人耳能听到的最高频率为20KHz
,所以为了满足人耳的听觉要求,采样率至少为40KHz
,通常为44.1KHz
,更高的通常为48KHz
。
注意:人耳听觉频率范围[20Hz,20KHz]
。
(2)采样位数
波形振幅在模拟信号上也是连续的样本值,而在数字信号中,信号一般是不连续的,所以模拟信号量化后,只能取一个近似的整数值,为了记录这些振幅值,采样器会采用一个固定的位数来记录这些振幅值,通常有8位、16位、32位。
注意:位数越多,记录的值越准确,还原度越高,但是占用的硬盘空间越大。
位数 | 最小值 | 最大值 |
8 | 0 | 255 |
16 | -32768 | 32767 |
32 | -2147483648 | 2147483647 |
3.3、音频编码
由于数字信号是由0、1组成的,因此,需要将幅度值转化为一系列0和1进行存储,也就是编码。
3.4、PCM
的采集步骤
模拟信号->采样(奈奎斯特采样定理)->量化->编码->数字信号
3.5、声道数
声道数是指支持能不同发声(注意是不同声音)的音响的个数。
- 单声道:1个声道
- 双声道:2个声道
- 立体声道:默认为2个声道
- 立体声道(4声道):4个声道
3.6、码率
码率是指一个数据量中每秒钟能通过的信息量,单位bps(bit per second)
码率 = 采样率 * 采样位数 * 声道数
3.7、常见的音频格式
CD格式、WAVE(*.WAV
)、AIFF
、MP3
、MIDI
、AAC
、WMA
、OggVorbis
4、FFmpeg
4.1、FFmpeg
是什么?
是一套可以用来记录、转化数字音频、视频、并能将其转化为流的开源计算机程序。它有着非常强大的功能,主要包括:视频采集功能、视频格式转换、视频抓图、给视频加水印等。
4.2、FFmpeg
的组成
FFmpeg
由三个部分组成:
(1)工具
分别是ffmpeg
、ffplay
、ffserver
和ffprobe
。
ffmpeg
:音视频转码、转换器
ffplay
:简单的音视频播放器
ffserver
:流媒体服务器
ffprobe
:简单的多媒体码流分析器
(2)SDK
提供开发者使用的SDK
,我们可以根据自己的需求使用这些库开发自己的应用程序,这些库主要有:
libavcodec
:包含音视频编码器和解码器
libavutil
:包含多媒体应用常用的简化编程的工具,如随机数生成器、数据结构、数学函数等功能
libavformat
:包含多种多媒体容器格式的封装、解封装工具
libavfilter
:包含多媒体处理常用的滤镜功能
libavdevice
:用于音视频数据采集和渲染等功能的设备相关
libswscale
:用于图像缩放和色彩空间和像素格式转换功能
libswresample
:用于音频量采样和格式转换等功能
libpostproc
:用于后期处理,当我们使用filter的时候,需要打开这个模块,filter会用到这个模块里的一些基础函数
(3)源代码
整个工程的源代码,无论是编译出来的可执行程序还是SDK
。
它的源代码由C语言实现,主要在Linux平台上进行开发。