音视频基础

2022-12-19  本文已影响0人  taoyyyy

视频、图像像素点数据格式

图像的色彩空间

用相同的数据格式不一定能输出颜色完全一样的图像,跟图像显示设备的色彩空间(也叫色域)有关。

隔行扫描与逐行扫描

隔行扫描(Interlaced)是一种将图像隔行显示在扫描式显示设备上的方法,例如早期的 CRT 电脑显示器。非隔行扫描的扫描方法,即逐行扫描(Progressive),通常从上到下地扫描每帧图像。
720i、1080i,“i”就是 Interlaced。隔行扫描
720p、1080p。逐行扫描。

帧率fps

就是我们平时提到的帧率(FrameRate),指一秒钟刷新的视频图像帧数(Frames Per Second),视频一秒钟可以刷新多少帧,取决于显示设备的刷新能力。

图像分辨率与比例

分辨率通常由宽、高与像素点占用的位数组成,计算方式为图像的宽乘以高。在提到显示分辨率的时候,人们还常常会提到宽高比,即 DAR。DAR 是显示宽高比率(display aspect ratio),表示不同分辨率的图像的差别。

I、P、B 帧

一个 I 帧可以不依赖其他帧就解码出一幅完整的图像,而 P 帧、B 帧不行。
P 帧需要依赖视频流中排在它前面的帧才能解码出图像。
B 帧则需要依赖视频流中排在它前面或后面的帧才能解码出图像。

DTS、PTS

DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。

音视频的采集

AudioRecoder、MediaRecoder

音视频编码

有损编码、无损编码。
编码的目的是为了压缩。

音频数据流

PCM格式(裸数据)--数字信号
编码压缩后生成 aac/mp3
map4/flv格式中包含mp3/aac数据

人类的听觉范围 20Hz~20kHz

以拨动尺子为例
音调:音频的快慢 儿童>女生>男生
音量:振动的幅度
音色:谐波

模数转换

image.png

采样率越高,失真越小。

声音量化的基本概念

采样大小:一个采样用多少bit存放。常用16bit
采样率:采样频率8k,16k,32k,44k,48k
声道数:单声道、双声道、多声道

音频原始数据

PCM裸数据
WAV格式=PCM+文件头


image.png image.png

PCM码率计算


image.png

音频采集

Android 采集
MediaRecoder
AudioRecoder
IOS
Windows

ffmpeg采集

命令方式

ffmpeg-f avdoundation -i :0 out.wav
ffmplay out.wav

api方式

音频采集 https://blog.csdn.net/qq_15255121/article/details/115301516

打开音频设备

采集步骤
注册设备
->设置采集方式avdoundation/dshow/alsa
->打开音频设备

读取音频数据

av_read_frame

第七章 音频编码原理

有损编码
无损编码

有损压缩是去除冗余信息,需要界定什么是冗余信息。
人耳频率之外的。20~2whz
遮蔽效应


image.png image.png

无损编码
熵编码:哈夫曼。算术、香农编码

常见编码器比较
常见的音频编码器OPUS,AAC


image.png
image.png image.png

AAC编码器介绍


image.png image.png
image.png

ADTS格式


image.png image.png

可以借助ffmpeg帮我们添加或者解析这个头。

通过ffmpeg命令生成AAC文件


image.png

-vn no video
-c 编码器 a audio libfdk_aac音频编码器
-ar 采样率
-channels 声道数
-profile :a 指定音频 aac规格
抽取输入的mp4文件中的音频并重新编码

8. 实战音频编码

音频重采样


image.png image.png image.png image.png image.png

创建AAC编码器


image.png
image.png

avcodec_send_frame 输入音视频数据给编码器
avcodec_receive_packet 获取编码后的数据
注意并不是输入一帧音频就输出一帧,有可能是输入若干帧,再输出。

AVFrame未编码的数据(音频输入数据)
AVPacket编码后的数据(编码后的数据)

9.视频的基础知识

h264 h265做压缩
每个像素的位深 RGB888 24位 ,RGBA 32位

image.png image.png image.png

360P,720P,1K,2K都是16:9

image.png
image.png image.png

只有电视支持YUV格式,手机不支持,只支持RGB

image.png image.png image.png image.png image.png

Y分量 明度
U分量/Cb分量 blue
V分量/Cr分量 red


image.png image.png image.png image.png image.png image.png image.png image.png
为什么有要这种编码方式

人眼对色度的敏感程度要低于对亮度的敏感程度既然看不见(或难发现差别),那么就不浪费全量444存储空间。

YUV的参考资料
image.png image.png

-i 输入多媒体文件
-an audio null过滤掉音频
-c:v 视频的编解码器 rawvideo
-pix_fmt 指定输出的YUV的格式

image.png

-pix_fmt 指定要播放的YUV格式,默认YUV420P
-s 播放的分辨率

image.png

-vf 滤波器

提取各分量,并分别保存到文件中 播放Y分量保存的文件
播放U分量文件

注意U/V分辨率是Y的一半

第十章 H264编码原理(重要)

H264压缩码率与GOP

H264优势之一在于压缩比,约为1/100

image.png

根据场景(实时通讯<直播)+分辨率+帧率会得到一个推荐的码率。


image.png

GOP(group of picture)


image.png image.png
IPB帧
IPB帧的概念.png

对实时性要求高需要IP帧多,对压缩率要求高需要B帧多


IDR与I帧

IDR帧起到了防止错误传播的作用

image.png

B帧需要前面的I帧和后面的P帧解码

SPS与PPS帧

SPS与PPS帧一般是成对出现的,且在IDR帧之前出现

H264中的宏块
image.png

前二者是有损压缩,后两者是无损压缩。

宏块是压缩技术的基础


image.png image.png image.png image.png image.png image.png

宏块越大,控制力弱,处理速度越快
宏块越小,控制力更强,压缩比更高(用于纹理特别精细的图)

帧内压缩技术

按宏块为单位进行比较,然后压缩存储


image.png

h264提供了9种模式做帧间预测,每个宏块的预测模式不一


image.png
image.png
image.png image.png
帧间压缩技术

帧间压缩一定是同一个GOP之间的。


image.png 宏块查找
运动估计
运动补偿
花屏原因.png
卡顿原因.png
无损压缩
image.png
image.png

DCT变换后将分散在nxn中的所有数据集中在开端。


image.png
H264码流结构

H264码流是分层存储。
NAL层的意义在于知道和处理二进制码流数据丢包和乱序的问题。

码流分层 VCL结构关系

一个图像由多个slice组成,一般是由一个slice组成。

码流的基本概念
SODB(String of Data Bits)编码器生成的二级制数据串,按位计算;
RBSP 按字节计算
NALU NAL Header(1B)+RBSP

image.png
NAL Unit H264切片
Slice与宏块MacroBlock

宏块= 宏块的类型+宏块的预测值+残差值


码流分层

文件传输需要加startCode,即Annexb格式(startCode是每个NAL单元的分隔符)
网络传输用RTP格式

第十一章 实战视频编解码

H264中的profile和level
主要内容
priofile与level
profile1 profile2 level
SPS重要参数
image.png image.png

默认的宏块是16*16


帧相关

GOP最大帧数

image.png
PPS与slice header
PPS.png
sliceheader
H264分析工具

前二者收费,后者免费


image.png image.png

推荐streameye,免费的就是雷神。

实战H264编码
image.png
编码器x264参数
image.png

preset fast/slow 编码速度
tune 质量 电影>动画>图片
这两个值是不互斥的。

帧相关的参数

keyint GOP size(想要达到更高的压缩率,可以将其设置得尽量大。想要避免丢包引起的卡顿,可以将其设置的尽量小)
min-keyint 最小key帧的值,与scenecut相关联
scenecut 达到多少不同就认为场景切换了
bframes 连续帧的最大数量
ref 参考帧的数量
no-deblock/deblock 将块进行平滑处理
no-cabac 是否使用cabac进行熵编码

流控
image.png image.png
编码分析

p8x8,p帧宏块的划分为8x8


image.png
image.png
image.png
image.png

12章 RTMP传输

12-1RTMP协议

rtmp协议是基于tcp的。


image.png image.png

12-2 创建rtmp流

创建RTMP流
推流
播放rtmp流

12-3 RTMP消息

FLV文件就是由“FLV Header + RTMP数据”构成的

12-7 推流程序的骨架

推流的具体步骤
上一篇下一篇

猜你喜欢

热点阅读