音视频、编码、rtmp学习

视频数据源YUV

一个视频简单点理解就是播放一张张画面。我们就从这里面把视频的相关名词扯出来:①一张画面,一张画面也就一帧画面;属性为图像的大小或尺寸称分别率;画面的成像组成的方式有:rgb和yuv;跟计算器关联起来还不是用0101的比特来表示②当画面遇上了时间,爱的结晶就出来了:比特率、帧率和刷新率。接下来我们简单介绍一下他们的作用:

  • 视频帧: 常见有I帧(关键帧,含完整画面,所以数据量大)、P帧(前向参考帧,参考前面I帧编码的图像信息)、B帧(双向预测帧,参考前面I帧、前面P帧和后面I帧编码的图像信息);我们网上看视频时常常会遇到拖动进度条出现回退一两秒的情况吧?因为那个位置的当前帧不是I帧,没有完整的画面。

  • 分辨率: 图像的大小或尺寸。

  • RGB: 任何彩色图像可由红绿蓝组成。RGB每一个通道占8位,1个字节内存。每个像素包含一个RGB,占3个字节(如果加上透明度RGBA则占32位,总共4个字节)。如:1920 x 1080内存大小=1920 x 1080 x 3=5.9M。

  • YUV(YCbCr): Y:亮度;UV:色度和饱和度;wiki YCbCr 介绍。目前大多数都是使用yuv格式来表示视频帧的裸流数据。具体详情请往下阅读。

  • 比特率(码率): 单位时间内播放媒体(包括视频和音频)的比特数量(bit的数量)。文件大小计算公式:
    文件大小(b)= 码率(b/s)x 时间(s)

  • 帧率(帧数): 画面每秒传输帧数,单位:fps(frame per second)或者 “赫兹”(Hz)。对于人眼感官常用范围在15~75fps之间。

  • 刷新率: 屏幕在每秒刷新(画面)的次数。单位:赫兹(Hz)。

YUV基本介绍

YUV分类与意义
planar和packed
对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。
对于packed的YUV格式,每个像素点的Y,U,V是连续交*存储的。

YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像(是不是写错了),只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。

YUV与RGB的相互转化

  1. RGB转YUV:
    Y = 0.299R + 0.587G + 0.114B
    U = 0.564(B - Y)
    V = 0.713(R - Y)

  2. YUV转RGB:
    R = Y + 1.402V
    B = Y + 1.772U
    G = Y - 0.344U - 0.714V

YUV码流的存储格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0,关于其详细原理,可以通过网上其它文章了解,这里我想强调的是如何根据其采样格式来从码流中还原每个像素点的YUV值,因为只有正确地还原了每个像素点的YUV值,才能通过YUV与RGB的转换公式提取出每个像素点的RGB值,然后显示出来。如图:
在这里插入图片描述
若分辨率为1920 x 1080

  • 4:4:4 每4个素位置都有4个YUV,内存计算:1920 x 1080 = 1920 x 1080 x 3=5.9M;
  • 4:2:2 每4个Y像素具有2个U和2个V;内存计算:1920 x 1080 = 1920 x 1080 x (1 + 2/4 + 2/4)=3.9M;
  • 4:2:0 每4个Y像素具有1个U和1个V,使用在视频领域中应用最广泛。内存计算:1920 x 1080 = 1920 x 1080 x (1 + 1/4 + 1/4)=2.8M;

视频像素数据在视频播放器的解码流程中的位置如下图所示。
在这里插入图片描述

手写分离YUV分量以及对其进行播放请参照雷博士
视音频数据处理入门:RGB、YUV像素数据处理
https://blog.csdn.net/leixiaohua1020/article/details/50534150

音视频数据源PCM

声音与音频

声音是波,成为声波,而声波的三要素是频率、振幅和波形。频率代表音阶的高低(女高音、男低音)单位赫兹(Hz),人耳能听到的声波范围:频率在20Hz~20kHz之间;振幅代表响度(音量);波形代表音色。而我们音频处理就是对声波采集成数字信号后进行处理。

音频采集与关键名词

音频采集的过程主要是通过设备设置采样率、采样数,将音频信号采集为pcm(Pulse-code modulation,脉冲编码调制)编码的原始数据(无损压缩),然后编码压缩成mp3、aac等封装格式的数据。音频关键知识:

  • 采样率: 一段音频数据中单位时间内(每秒)采样的个数。
  • 位宽: 一次最大能传递数据的宽度,可以理解成放单个采集数据的内存。常有8位和16位,而8位:代表着每个采集点的数据都使用8位(1字节)来存储;16位:代表着每个采集点的数据都使用16位(2字节)来存储。
  • 声道数: 扬声器的个数,单声道、双声道等。每一个声道都占一个位宽。
    来一张图来描述一下:
    在这里插入图片描述
    一段时间内的数据大小如何计算?

采样率 x (位宽 / 8) x 声道数 x 时间 = 数据大小(单位:字节)

比如 2分钟的CD(采样率为:44100,位宽:16,声道数:2)的数据大小:44100 x (16 / 8) x 2 x 120 = 20671.875 Byte 约为 20.18M。

PCM数据的基本使用

采集到的pcm原始数据要处理;首先得知道怎么这些数据都代表啥意思,然后才能入手处理。

1、pcm数据时如何组成(存储)?
举个例子,分别使用不同的方式存储一段采集数据 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88 总共8个字节。

  • 8位单声道: 按照数据采集时间顺序存储,即:0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88

  • 8位双声道: L声道-R声道-L声道-R声道形式存储,即:0x11(L) 0x22® 0x33(L) 0x44® ……

  • 16位单声道: 首先从 维基多媒体:pcm了解到位宽大于8位时,字节的排序方式是有差别的,描述如下:

当使用一个以上的字节表示PCM样本时,必须知道字节顺序(大端与小端)。由于低端字节Intel CPU的广泛使用,低端字节PCM往往是最常见的字节方向。

举个例子:当位宽为16位(2字节)存储一个采集数据时,如:0x12ab,大端和小端分别是:

big-endian: 0x12 0xab;
little-endian: 0xab 0x12。

所以:
big-endian存储方式:0x1122 0x3344 0x5566 0x7788;
little-endian存储方式:0x2211 0x4433 0x6655 0x8877。

16位双声道: L声道-R声道-L声道-R声道形式存储:

big-endian:0x1122(L) 0x3344® 0x5566(L) 0x7788®

little-endian: 0x2211(L) 0x4433® 0x66550(L) 0x8877®

播放pcm原始数据

ffmpeg:
ffplay -f s16le -sample_rate 44100 -channels 2 -i xxx.pcm

雷博士
视音频数据处理入门:PCM音频采样数据处理
https://blog.csdn.net/leixiaohua1020/article/details/50534316

H264视频编码

编码

当我们把摄像头采集画面直接写入到文件中时,我们会发现没一会文件已经非常大了。这导致很不适合保存和传输,所以需要编码,把画面数据进行压缩。视频编码标准有很多,而我们这里讲的是H.264编码。其他请看:视频编码标准汇总及比较。

H.264编码的特点

1.低码率(Low Bit Rate):和MPEG2和MPEG4 ASP等压缩技术相比,在同等图像质量下,采用H.264技术压缩后的数据量只有MPEG2的1/8,MPEG4的1/3。 [1]
2.高质量的图像:H.264能提供连续、流畅的高质量图像(DVD质量)。 [1]
3.容错能力强:H.264提供了解决在不稳定网络环境下容易发生的丢包等错误的必要工具。 [1]
4.网络适应性强:H.264提供了网络抽象层(Network Abstraction Layer),使得H.264的文件能容易地在不同网络上传输(例如互联网,CDMA,GPRS,WCDMA,CDMA2000等)。 [1]
H.264最大的优势是具有很高的数据压缩比率,在同等图像质量的条件下,H.264的压缩比是MPEG-2的2倍以上,是MPEG-4的1.5~2倍。举个例子,原始文件的大小如果为88GB,采用MPEG-2压缩标准压缩后变成3.5GB,压缩比为25∶1,而采用H.264压缩标准压缩后变为879MB,从88GB到879MB,H.264的压缩比达到惊人的102∶1。低码率(Low Bit Rate)对H.264的高的压缩比起到了重要的作用,和MPEG-2和MPEG-4 ASP等压缩技术相比,H.264压缩技术将大大节省用户的下载时间和数据流量收费。尤其值得一提的是,H.264在具有高压缩比的同时还拥有高质量流畅的图像,正因为如此,经过H.264压缩的视频数据,在网络传输过程中所需要的带宽更少,也更加经济。
百度百科:
https://baike.baidu.com/item/H.264?fromtitle=H264&fromid=7338504

视频编码标准汇总及比较

雷博士:
https://blog.csdn.net/leixiaohua1020/article/details/84483343

音频编码之AAC

我们采集到的PCM原始数据流(俗称裸流)由于PCM裸流过大,不便于储存与传输,于是就出现了针对于PCM裸流的压缩编码标准,包含AAC,MP3,AC-3 等等(wiki audio file format);而AAC则是当前的主流。这里的AAC指的是一套编码标准(协议),而faac是一个开源的AAC编解码工具。

简述

AAC:高级音频编码(Advanced Audio Coding),基于MPEG-2的音频编码技术,目的是取代MP3格式。2000年,MPEG-4标准出现后,AAC重新集成了其特性,为了区别于传统的MPEG-2 AAC又称为MPEG-4 AAC。

AAC的音频文件格式

AAC的音频文件格式有两种ADIF和ADTS。这两种格式主要区别:ADIF只有一个文件头,ADTS每个包前面有一个文件头。而我们重点讲解的是ADTS格式。

ADIF

Audio Data Interchange Format 音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。故这种格式常用在磁盘文件中。编码格式如下:
在这里插入图片描述

ADTS

Audio Data Transport Stream 音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。也就是说ADTS的每一帧都有一个header和aac音频数据,这可以在网络传输的时候进行实时解码。

直播推流编码RTMP

简述

Adobe 公司的实时消息传输协议 (RTMP) 通过一个可靠地流传输提供了一个双向多通道消息服务,意图在通信端之间传递带有时间信息的视频、音频和数据消息流。

Handshake Diagram(握手流程)
在这里插入图片描述

  • Uninitialized (未初始化): 客户端发送C0包(1 字节,版本信息),如果服务器支持这个版本会响应S0和S1,否则终止连接。
  • Version Sent (版本已发送): 当服务器接收到版本号后(已发送S0和S1),客户端等S1,服务器等C1,当都接收后,客户端发送C2,服务器发送S2,然后两者状态变成Ack Sent。
  • Ack Sent (确认已发送): 客户端和服务器分别等待 S2 和 C2。
  • Handshake Done (握手结束): 客户端和服务器可以开始交换消息了。

分块

网络传输过程中,每一个块(每个rtmp包)必须被完全发送才可以发送下一块,而在接收端,这些块被根据 chunk stream ID 被组装成消息。分块允许上层协议将大的消息分解为更小的消息,例如,防止体积大的但优先级小的消息 (比如视频) 阻碍体积较小但优先级高的消息 (比如音频或者控制命令)。分块也让我们能够使用较小开销发送小消息,因为块头包含包含在消息内部的信息压缩提示。下面块格式就是一个块的组成。(注意:当连续接收到chunk stream ID 相同时,这些快是同一个消息,需要合并。)

Chunk Format(块格式)
下图大致的概括了一块的组成,从当前块的 第一个字节 大致能分析出该块头的组成信息。
在这里插入图片描述
RTMP 协议规范(中文版)
https://www.cnblogs.com/Kingfans/p/7083100.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SS_zico

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值