流媒体:音视频编码

一、音频编码

1.1 为什么需要音频编码

音频编码的主要作用是将音频采样数据(PCM 等)压缩成为音频码流,从而降低音频的数据量,偏于存储和传输,跟视频编码的作用类似。

1.2 音频基本概念

采样频率

单位时间内对模拟信号的采样次数。采样频率越高,声音的还原就越真实越自然,当然数据量就越大。采样率根据使用类型不同大概有以下几种:

8khz:电话等使用,对于记录人声已经足够使用。
22.05khz:广播使用频率。
44.1khz:音频CD。
48khz:DVD、数字电视中使用。
96khz-192khz:DVD-Audio、蓝光高清等使用。
采样精度常用范围为 8bit-32bit,而 CD 中一般都使用 16bit。

采样位数

采样位数,也称量化级、样本尺寸、量化数据位数,指每个采样点能够表示的数据范围,它以位(Bit)为单位。采样位数通常有 8bits 或 16bits 两种,采样位数越大,所能记录声音的变化度就越细腻,相应的数据量就越大。8 位字长量化(低品质)和 16 位字长量化(高品质),16 bit 是最常见的采样精度。

声道数

声道数是指支持能不同发声的音响的个数,它是衡量音响设备的重要指标之一。

量化

将采样后离散信号的幅度用二进制数表示出来的过程称为量化。(日常生活所说的量化,就是设定一个范围或者区间,然后看获取到的数据在这个条件内的收集出来)。

编码

采样和量化后的信号还不是数字信号,需要将它转化为数字编码脉冲,这一过程称为编码。模拟音频进采样、量化和编码后形成的二进制序列就是数字音频信号。

PCM

PCM(Pulse Code Modulation),即脉冲编码调制,对声音进行采样、量化过程,未经过任何编码和压缩处理。

比特率

比特率(也称位速、比特率),是指在一个数据流中每秒钟能通过的信息量,代表了压缩质量。比如 MP3 常用码率有 128kbit/s、160kbit/s、320kbit/s 等等,越高代表着声音音质越好。

比特率 = 采样率 × 采样深度 × 通道数。比如 采样率 = 44100,采样深度 = 16,通道 = 2 的音频的的比特率就是 44100 * 16 * 2 = 1411200 bps。

有损压缩和无损压缩

有损压缩就是通过删除一些已有数据中不太重要的数据来达到压缩目的。

无损压缩就是通过优化排列方式来达到压缩目的。

大概可以这样去看:有损压缩就像我们在一篇文章中删除一些不重要的助词,达到目的,解压缩后,已删除的内容无法恢复;而无损则是通过排版方式达到的,解压缩之后,还能获得完整的PCM数据。

常用音频编码格式

  • PCM
    PCM (Pulse Code Modulated Audio)也被称为脉冲编码调制,是目前计算机应用中最高保真水平的音频编码格式。PCM音频数据是未经压缩的音频采样数据裸流,它是由模拟信号经过采样、量化、编码转换成的标准的数字音频数据。PCM约定俗成了无损编码,能做到最大程度的无限接近绝对保真。被广泛用于素材保存及音乐欣赏,CD、DVD以及我们常见的WAV文件中均有应用,优点是音质好,缺点是体积大。

  • WAV
    PCM(脉冲编码调制)是 Pulse Code Modulation 的缩写。WAV 编码的一种实现(有多种实现方式,但是都不会进行压缩操作)就是在 PCM 数据格式的前面加上 44 字节,分别用来描述 PCM 的采样率、声道数、数据格式等信息。
    特点:音质非常好,大量软件都支持。
    适用场合:多媒体开发的中间文件、保存音乐和音效素材。

  • MP3(有损)
    MP3 具有不错的压缩比,使用 LAME 编码(MP3 编码格式的一种实现)的中高码率的 MP3 文件,听感上非常接近源 WAV 文件,当然在不同的应用场景下,应该调整合适的参数以达到最好的效果。
    特点:音质在 128Kbit/s 以上表现还不错,压缩比比较高,大量软件和硬件都支持,兼容性好。
    适用场合:高比特率下对兼容性有要求的音乐欣赏。

  • AAC(有损)
    AAC 是新一代的音频有损压缩技术,被认为是MP3的继任者,相对MP3有更高的压缩效率。

    ADTS Frame由ADTS_Header和AAC ES组成。
    ADTS_Header包含采样率、声道数、帧长度的信息。
    ADTS头信息的长度是7个字节或9字节(有CRC的情况)。
    ADTS_Header的可以分为以下三部分:
    adts_fixed_header:每一帧的内容是不变的。
    adts_variable_header:每一帧的内容是存在变化的。
    crc:16bits,protection_absent字段为0时存在。
    特点:支持带宽:96-128 kbps,在小于 128Kbit/s 的码率下表现优异,并且多用于视频中的音频编码。
    适用场合:128Kbit/s 以下的音频编码,多用于视频中音频轨的编码。
    优点:支持多种音频声道组合,提供优质的音质

  • G.711
      G711是国际电信联盟ITU-T定制出来的一套语音压缩标准,它代表了对数PCM(logarithmic pulse-code modulation)抽样标准,主要用于电话。它主要用脉冲编码调制对音频采样,采样率为8k每秒。它利用一个 64Kbps 未压缩通道传输语音讯号。 起压缩率为1:2, 即把16位数据压缩成8位。G.711是主流的波形声音编解码器。
    G711的内容是将14bit(uLaw)或者13bit(aLaw)采样的PCM数据编码成8bit的数据流,播放的时候在将此8bit的数据还原成14bit或者13bit进行播放,不同于MPEG这种对于整体或者一段数据进行考虑再进行编解码的做法,G711是波形编解码算法,就是一个sample对应一个编码,所以压缩比固定为:
    8/14 = 57% (uLaw)
    8/13 = 62% (aLaw)
    简单理解,G.711就是语音模拟信号的一种非线性量化, bitrate 是64kbps,sample rate是8K,压缩率固定为2.
    支持带宽:64Kbps
    优点:算法复杂度低,压缩比小(CD音质>400kbps),编解码延时最短(相对其它技术)
    缺点:音质一般,占用的带宽较高

二、视频编码

2.1 H264压缩技术

帧内压缩:
解决的是空域数据冗余问题。当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。帧内一般采用有损压缩算法,由于帧内压缩是编码一个完整的图像,所以可以独立的解码、显示。帧内压缩一般达不到很高的压缩,跟编码jpeg差不多。
帧间压缩
(运动估计与补偿),解决的是时域数据冗徐问题。相邻几帧的数据有很大的相关性,或者说前后两帧信息变化很小的特点。也即连续的视频其相邻帧之间具有冗余信息,根据这一特性,压缩相邻帧之间的冗余量就可以进一步提高压缩量,减小压缩比。帧间压缩也称为时间压缩(Temporalcompression),它通过比较时间轴上不同帧之间的数据进行压缩。帧间压缩一般是无损的。帧差值(Framedifferencing)算法是一种典型的时间压缩法,它通过比较本帧与相邻帧之间的差异,仅记录本帧与其相邻帧的差值,这样可以大大减少数据量。

I帧:关键帧,采用帧内压缩技术。
P帧:向前参考帧,在压缩时,只参考前面已经处理的帧。采用帧音压缩技术。
B帧:双向参考帧,在压缩时,它即参考前而的帧,又参考它后面的帧。采用帧间压缩技术。

2.2 GOP(画面组)

GOP我个人也理解为跟序列差不多意思,就是一段时间内变化不大的图像集。GOP结构一般有两个数字,如M=3,N=12。M指定I帧和P帧之间的距离,N指定两个I帧之间的距离。上面的M=3,N=12,GOP结构为:IBBPBBPBBPBBI。在一个GOP内I frame解码不依赖任何的其它帧,p frame解码则依赖前面的I frame或P frame,B frame解码依赖前最近的一个I frame或P frame 及其后最近的一个P frame。

所以在码率不变的前提下,GOP值越大,P、B帧的数量会越多,画面细节更多,也就更容易获取较好的图像质量;Reference越大,B帧的数量越多,同理也更容易获得较好的图像质量。

需要说明的是,通过提高GOP值来提高图像质量是有限度的,在遇到场景切换的情况时,H.264编码器会自动强制插入一个I帧,此时实际的GOP值被缩短了。另一方面,在一个GOP中,P、B帧是由I帧预测得到的,当I帧的图像质量比较差时,会影响到一个GOP中后续P、B帧的图像质量,直到下一个GOP开始才有可能得以恢复,所以GOP值也不宜设置过大。

同时,由于P、B帧的复杂度大于I帧,所以过多的P、B帧会影响编码效率,使编码效率降低。另外,过长的GOP还会影响Seek操作(找I帧)的响应速度,由于P、B帧是由前面的I或P帧预测得到的,所以Seek操作需要直接定位,解码某一个P或B帧时,需要先解码得到本GOP内的I帧及之前的N个预测帧才可以,GOP值越长,需要解码的预测帧就越多,seek响应的时间也越长。

2.3 H264层级

1、网络提取层 (Network Abstraction Layer,NAL)

2、视讯编码层 (Video Coding Layer,VCL)

H.264的功能分为两层,视频编码层(VCL)和网络提取层(NAL)。
1.VCL数据即被压缩编码后的视频数据序列。
2.在VCL数据要封装到NAL单元中之后,才可以用来传输或存储。


SPS:序列参数集,作用于一系列连续的编码图像;
PSS:图像参数集,作用于编码视频序列中一个或多个独立的图像;

2.4 RTP封包vH264的方式

NALU打包成RTP的方式有三种:

  • 1 .单一 NAL 单元模式
    对于 NALU 的长度小于 MTU 大小的包, 一般采用单一 NAL 单元模式.
  • 2 .组合封包模式
    其次, 当 NALU 的长度特别小时, 可以把几个 NALU 单元封在一个 RTP 包中.
  • 3 .FragmentationUnits
    而当 NALU 的长度超过 MTU 时, 就必须对 NALU 单元进行分片封包. 也称为 Fragmentation Units (FUs)。这种封包方式有FU-A,FU-B。

2.5 视频的封装格式

视频封装格式,通常我们把它称作为视频格式,它相当于一种容器,比如可乐的瓶子,矿泉水瓶等等。它里面包含了视频的相关信息(视频信息,音频信息,解码方式等等),一种封装格式直接反应了视频的文件格式,封装格式:就是将已经编码压缩好的视频数据 和音频数据按照一定的格式放到一个文件中.这个文件可以称为容器. 当然可以理解为这只是一个外壳.通常我们不仅仅只存放音频数据和视频数据,还会存放 一下视频同步的元数据.例如字幕.这多种数据会不同的程序来处理,但是它们在传输和存储的时候,这多种数据都是被绑定在一起的.

2.6 其他问题

强制I帧(IDR帧)

即时解码刷新,其实就是I帧,不过他是第一个I帧,或者是强制I帧,它的作用就是立即刷新,使错误不至于传播,从IDR开始,重新算一个新的序列开始编码。IDR会导致DPB(参考序列表)清空,而I帧不会,IDR帧一定是I帧,但是I帧不一定。一个图像序列中可以有很多I帧,一个I帧后的图像可以引用I帧之间的图像做运动参考,但是对于IDR帧来说,IDR帧后的图像不能引用IDR之前的帧内容,因为从IDR帧相当于重新开始。

录像数据解码播放必须从I帧开始,而客户端录像的时候开始时间点不一定是I帧,比如帧率25fps、I帧间隔100帧的情况下,每4秒才一个I帧,录像播放可能存在1~4秒的延时,所以录像的时候可以强制设备生成一个I帧。

当h264数据在使用udp传输时,丢包是一件很常见的事情,当接收端丢包发生后,应该通知发送端,让发送端立刻重新发送一个关键帧。此时就需要编码器无视关键帧间隔立刻编出一个关键帧。

视频花屏/卡顿原因

我们平常在观看视频的时候,出现视频的花屏或者卡顿,第一反应就是我们的网络出现了问题,其实我们的网络没有问题,是我们在解码的时候I帧,B/P帧出现了丢失

如果GOP分组中的P帧丢失就会造成解码端的图像发生错误.

为了避免花屏问题的发生,一般如果发现P帧或者I帧丢失.就不显示本GOP内的所有帧.只到下一个I帧来后重新刷新图像.

当这时因为没有刷新屏幕.丢包的这一组帧全部扔掉了.图像就会卡在哪里不动.这就是卡顿的原因.所以总结起来,花屏是因为你丢了P帧或者I帧.导致解码错误. 而卡顿是因为为了怕花屏,将整组错误的GOP数据扔掉了.直达下一组正确的GOP再重新刷屏.而这中间的时间差,就是我们所感受的卡顿.
解码H264视频出现花屏或马赛克的问题_zhoubotong2012的博客-CSDN博客_h264花屏

VLC播放h264头几秒花屏问题?

看了下h264码流,sps与pps后第一个nalu类型为sei(附加增强信息),也就是0x00000106起始码开头的,不是I帧,所以会出现这个情况。vlc没有对sei信息做处理,导致把sei与后面数据混在一起解码处理,出现丢数据的假象,而导致花屏。vlc处理首帧的正确姿势是:SPS+ PPS + I frame。后面碰到sei类型nalu数据直接丢掉,然后送给vlc播放,就正常了。后面又测了其他mp4文件,发现这些mp4文件mdat box存储的第一个nalu类型都为sei。所以可以采取丢掉sei,读取完SPS+PPS后送给vlc后,跳过sei,从I帧开始继续送给vlc播放就可以避免播放出现花屏。

参考

常见音频编码格式解析_houxiaoni01的博客-CSDN博客_常见的音频文件格式有哪些
音频编解码介绍(最全) - 知乎
H264简介_屁小猪的博客-CSDN博客_h264
(145条消息) 如何发送和接收RTP封包的H264,用FFmpeg解码_zhoubotong2012的博客-CSDN博客_发送rtp包

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
|---------H.264encode(h264编码代码) |---------h264的编解码库和头文件,采用ffmpeg和x264编译(h264交叉编译ffmpeg) |--------- H264Player.rar(H264播放器源代码纯C++) |--------- |--------- H264的经典算法优化 |--------- JM H264解码程序 |--------- h264的编解码库和头文件, |--------- 采用ffmpeg和x264编译 h264和mepg4协议标准 |--------- H264流媒体源代码和相关资料.rar9 |--------- h264实时分析工具H264Visa |--------- h264视频采集 |--------- h264相关资料和源代码 |--------- ,decode264是一个使用ffmpeg sdk开发h264解码的例子 |--------- H264资料打包(二) |--------- H264资料打包(一) |--------- x264视频编解码在linux下实现的源码 |--------- [pdf文档] h264中文协议(中英文对照)9 |--------- T-REC-H.264 |--------- H264新手入门(H264乐园聊天记录 |--------- h24-tw(台湾教程) |--------- h264解码之CAVLC编码实例 |--------- h264_encoder(一个最经典的c语言的源代码) |--------- PDFH.264_GraphShow 2.linux_ffmpeg_h264视频频编码界面(不断更新更新的内容通过邮箱发布)----- |---------linux环境下视频编程流程 |--------- 基于Linux高清视频无线传输系统设计研究 |--------- 基于嵌入式Linux的远程网络视频监控系统 |--------- 基于linux_V4L视频采集摄像程序 |--------- 基于Linux的视频传输系统(完整方案) |---------嵌入式Linux应用开发完全手册视频源码 |---------arm-linux平台的视频监控程序 |---------交叉编译ffmpeg_+_x264_编码H264_(arm_Linux 3.android视频频_h264_ffmpeg------------------------ |---------JVT-G050 |--------- FFMPEG移植到Android |--------- 视频的源码,很详细并有注释可用于学习 Android视频采集和实现 |--------- ,采用h264视频编码,3gp格式 android中调用FFMPEG4解码方法与so文 |--------- jm15.0 |--------- ffmpeg for android library anroid手机上的一个音视频编解码库 |--------- |--------- 利用Android 浏览器引擎Webkit 加载具有视频监控功能的插件,以此插件为核心模块扩展浏览器的功能,从而实现手机监控 |--------- ffmpeg H264学习指南介绍 |--------- android opencore框架下的视频编码源码实现 android 视频监控的,开启本地摄像机,设置好端口即可 |--------- android 视频实时采集并上传到服务器上 android的视频监视器,捕捉接收远程的监视视频并显示在手机上

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值