FFmpeg-音视频基础

编码encode

通过压缩技术,将原始音视频格式的文件转换成另一种视频格式文件,目的是减少字节,进行压缩。

为什么会需要压缩?

因为视频中每一帧都是一张图片,各个帧之间存在很大相似,如果不压缩,文件将会很大

如:将YUV420/422格式的视频编码为 H264格式的视频

image-20210604203624412

输入是一个图片(像素的集合,像素的格式为YUV420等),在ffmpeg中叫做frame。

解码decode

编码的逆过程,只有解码才能转换为有意义的图像流。

如:H264 -> YUV420/422

转码transcode

将已经压缩编码的视频码流转换成另一个视频码流,以适应不同的网络带宽、不同的终端处理能力和不同的用户需求。 转码本质上是一个先解码,再编码的过程,因此转换前后的码流可能遵循相同的视频编码标准,也可能不遵循相同的视频编码标准。

如将1080P视频转换为720P的视频

分辨率的本质是图片的宽高

帧率是影片每秒显示多少帧,越高越流畅

视频比特率(码率)是指每秒传送的比特(bit)数。单位为bps(Bit Per Second),比特率越高,每秒传送数据就越多,画质就越清晰。

采样频率(采样速度,采样率),定义了单位时间内从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。采样频率的倒数是采样周期或者叫作采样时间,它是采样之间的时间间隔。

封装mux

复用,按照一定格式组织原音视频流,将音频和视频组装到一起。

解封装demux

解复用,按照一定格式解析出原始音视频流。

image-20210604210617678

音视频相关,网络传输协议:

image-20210604210711546

推模式

当通知消息来之时,把所有相关消息通过参数的形式“推送”给观察者。

拉模式

当通知消息来之时,通知的函数不带任何相关的信息,而是要观察者主动去“拉取”信息。

实时流

Real Time Stream,实时传输的音视频流。

和录像并播放相反。

音视频基本概念精讲

视频、音频相关概念

宽width、高height、帧率frame rate、编码方式coding scheme(H264和H265,主要H264)、码率bit rate、分辨率resolution(像素为单位的宽和高)、像素pixel

采样率sample rate、通道数channels(单声道、双声道)、位宽(占用的字节数)、采样格式sample format、采样点sampling point

编码、解码、转码

同上面

补充:

编码大大节省了存储资源,如果不编码压缩,视频大小会很大。

转码如:将摄像机的rtsp流转换为网页端播放的rtmp流。转码是由需求决定的。

音频编码中AAC最适用

rtsp流、rtmp流、hls流

rtsp是“拉”模式的流,

hls流兼容性非常好,本质上是ts流

时间基数

https://blog.csdn.net/fanyun_01/article/details/89608876

DTS和PTS的解释

FFmpeg里有两种时间戳:DTS(Decoding Time Stamp)和PTS(Presentation Time Stamp)。

PTS:Presentation-Time-Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来。

DTS:Decode-Time-Stamp。DTS主要是标识读入内存中的比特流在什么时候开始送入解码器中进行解码。

前者是解码的时间,后者是显示的时间。

在大多数编解码标准(如H.264或HEVC,当出现B帧的时候)中,编码顺序和输入顺序并不一致。于是才会需要PTS和DTS这两种不同的时间戳。

PTS:视频帧显示时间。

DTS:视频帧解码时间。

时间戳 = pts * (AVRational.num/AVRational.den)

1
2
3
4
typedef struct AVRational{
int num; ///<分子
int den; ///< 分母
} AVRational;

其实当num=1,den=1000的时候pts的时间单位就相当于毫秒 1/1000秒
其实当num=1,den=1000000的时候pts的时间单位就相当于微秒 1/1000000秒