这里将了解到的和一些博客网站讲到的音视频基础相关的内容总结整理到了一起,方便系统的学习和回顾记录。

首先一个最简易的音视频图解,包括一下几个部分:

                                       åç»å°ç½çå®æ¶é³è§é¢ææ¯å¥é¨æ纲_1.jpg

对于一个实时音视频应用共包括几个环节:采集、编码、前后处理、传输、解码、缓冲、渲染等很多环节。每一个细分环节,还有更细分的技术模块。比如,前后处理环节有美颜、滤镜、回声消除AEC、噪声抑制NS、静音控制VAD、自动增益控制AGC等,采集有麦克风阵列等,编解码有VP8、VP9、H.264、H.265等。 

典型的实时音视频应用数据流转过程如下:
福利贴:最全实时音视频开发要用到的开源工程汇总_0.jpeg 

下面这张图可能更具体一点:
福利贴:最全实时音视频开发要用到的开源工程汇总_165438k8ms1a24a1z20r17.jpeg

整个图包含了音视频数据从打包、编解码、传输、推拉流、播放等整个过程,这里边包含了很多音视频基础知识,下边归纳整理一下。

音频相关:

CDN构成:

①边缘结点:用户会先从边缘结点获取服务;
②二级结点(主干结点):主要是用于缓存,减轻源站的压力。如果边缘结点没有服务,会先从主干结点上拉取缓存的数据到边缘结点,然后用户再从边缘结点获取数据;
③源站:(会有多个源节点)内容提供商会将内容放在源站上。如果边缘结点和主干结点都没有获取到服务,则会访问源站。

 

常用工具:

①ffmpeg
②ffplay:也是基于ffmpeg
③flashplayer

音频三要素:

①音调(音频)
②音量
③音色(根材质有关)

听觉范围:

①<20HZ,次声波
②20HZ~20KHZ,可以听见的
③>20KHZ,超声波

音频的量化与标准

 

①采样大小:也就是采样的纵坐标对应的值,表示一个采样用多少位存放。一般为16bit(2^16 = 65535),也可以是8位,但是8位对应的是256,比较小,一般采用16位。
采样率:一般由8k,16k,32k,44.1k(AAC用这个),48k
可以把它理解为,要采集的总量,拿44.1k举例,比如说,现在要采集20HZ的,就要采集(44100/20=)2000次,而要采集20KHZ的,就要采集(44100/20000=)2次;

③声道:单声道、双声道、多声道(上下左右等都有一个喇叭)

码率:

采样率 x 采样大小 x 声道数
比如:
采样率为:44.1k
采用大小为:16bit
双声道的PCM编码的WAV文件,它的码率为:
44.1k x 16 x 2=1411.2kb/s--->除以8--->176.4kB/s

音频的压缩技术:

  • 有损压缩(就是说还原回来的数据和原数据不一样):消除冗余的数据

    • 人耳听不到的声音:<20HZ或 >20kHZ的
    • 被遮蔽掉的声音(受频域和时域的影响)
  • 无损压缩:哈夫曼无损编码

     

常见的音视频编解码器:

类型特点应用场景
OPUS最流行的,内部有两个核心模型:基于口和基于耳,内部自主进行选择实时互动(口模型),声音乐器等高保真的(耳模型);不适用与泛娱乐化场景,因为泛娱乐化场景中是用的rtmp协议,这个协议可以支持AAC和Speex;
AAC 泛娱乐化
Vorbis  
Speex除了音视频编解码之外,还可以进行回音消除,降噪 
iLBC  
AMR  
G.711 音视频会议会用到固话,固话用的就是G.711和G.712

性能对比:OPUS>AAC>Vorbis

AAC(Advanced Audio Coding):

为什么这么重要?
①应用范围广,在泛娱乐化中大部分都是用的这个;
②协议的支持:在泛娱乐化中要用的是rtmp协议,而AAC支持这个协议
③它的高保真可以保证音频的质量

目的:取代MP3
原因:MP3的规范是MPEG-2,这个规范在音频方面的处理是有损压缩,也就是说还原回来的数据和原数据不能一模一样,对音质有损耗;而AAC的损耗更小,且压缩率更高,他是基于MPEG-4规范的;

规则全名特点码流
AAC LCLow Complexity 低复杂度, 码流为 128k
AAC HE V1AAC LC + SBR(Spectral Band Replication 分频复用)将一个音频的频带分成两部分:低频和高频,分别进行编码码流为64k左右
AAC HE V2AAC LC + SBR + PS(Parametric Stereo )对于双声道来说,只完整保存其中一个声道的音频,另一个只保存差异性的数据就行了,因为两个声道关联性很强,可以通过一些公式,得到原始的数据码流为32k左右
格式全名特点区别
ADIFAudio Data Interchange Format在一个音频文件的开始加一个头(如:采样大小/采样率/声道数等),之后取出的每一帧都套用这个头去编解码;只能从头部开始解码,常用在磁盘文件中
ADTSAudio Data Transport Stream在音频文件的每一帧签名都加7~9个字节,表示它的采样大小等可以从任意位置开始解码,类似于数据流格式

AAC编码库哪个好?

Libfdk_AAC > ffmpeg AAC > libfaac > libvo_aacenc

三、视频:

1.几种帧:

  • I帧:又叫关键帧,也就是一组帧中的第一帧;
  • P帧:向前参考帧,也就是说,他只参考它的前一帧,存的是和前一帧不同的地方,属于帧间压缩;
  • B帧:双向参考帧,它会参考它的前一帧和它的后一帧,存的是前后帧都没有的,不适合实时互动场景
  • GOP:一组帧,在一组帧的前面会有SPS(Sequence Parameter Set,序列参数集)和PPS(Picture Parameter Set,图像参数集)

     

     

2.视频花屏和卡顿的原因

花屏主要是有帧的丢失:比如P帧或者是I帧丢失了;
卡顿主要是为因为为了解决避免花屏的情况,就把丢失的那一组帧全部扔掉,然后就会卡屏了;

3.编码器分类:

名字特点
x264/x265x264的性能更好,x265的压缩比高,但是CPU占用也高,不适合直播
openH264是使用的svc,比如说把一帧分成3层(小中大),当网络较差的时候,只发送内核层,较好的时候,多发送异常,这样以此类推,多一层,画质就会更清晰一些
vp8/vp9是goole推出的,vp8是基于x264,vp9是基于x265的

H264编码原理:

  • 压缩技术:

    • 帧内预测压缩,解决空域数据冗余问题,比如一张图片上人眼无法直接感官到的颜色值等;
    • 帧间预测压缩,解决时域上数据冗余的问题,比如在录制视频的时候,会有很大帧的图像是一样的;
    • 整数离散余弦变换(DCH),将空间上的相关性变成频域上的无关的数据然后进行量化;
    • CABAC:上下文适应的无损压缩
  • 宏块划分

     

     

 

从上面的图中可以看出,整张图宏划分后就是这样的了;

 

  • 分层:

    • NAL层:网络抽象层

    一个帧的拆包和组包都是在这里完成的;(为什么要拆包和组包呢?因为网络的最大传输单元是1500字节,而每一帧大于1500字节,所以得拆包)

    • VCL层:视频编码层
  • 码流:

名字特点
SODB原始数据比特流,由VCL层产生,不一定是8的倍数
RBSPSODB + traling bits,在SODB的末尾加1,还不足8位的,补0
EBSP压缩流,在帧的开头加一个起始位,一般是16进制的0000 0001或者是00 00 01,因为压缩流中可能也会有连续的0,所以在压缩流中连续的0前面加 0x03;
NALUNAL头(1个字节)+EBSP
  • NAL单元

     

     

  • 切片与宏的关系

     

     

 

  • H264码流分层

     

     

4.NAL(NAL header + body)

  • NAL Header(1个字节8位):
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI|   TYPE  |

F:禁止位,在H264中规定必须为0
NRI:指示重要性,暂时不用
Type:表示NALU单元的类型,常用的类型有5(IDR图像的片,关键帧的一部分)
、7(序列参数集 FPS)、8(图像参数集 PPS)、28/29(分片的单元-->分片之后再通过FU Header组合)

  • 单一类型:一个RTP包只包含一个NALU,也就是说一个H264帧中只包含一个片(P帧、B帧)

     

     

  • 组合类型:一个RTP包包含多个NALU(SPS、PPS)

     

     

  • 分片类型:一个NALU单元分成多个RTP包,类型是28,29

     

     

  • FU Header:

+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|S|E|R|   TYPE  |

S:分片的开始
E:分片的结束
R:未使用,设置为0
Type:分片NAL的类型

5.YUV(YCbCr)

Y:明亮度,又叫灰阶值
U和V:表示色度,描述影像的色彩及饱和度,用于指定像素的颜色
用途:还是为了节省存储空间

常见格式:

  • YUV4:2:0
  • YUV4:2:2
  • YUV4:4:4

存储格式:

  • 平面(Planer)

    • I420:YYYYYYYY UU VV-->YUV420P
    • YV12:YYYYYYYY VV UU-->YUV420P
  • 打包(packed)

    • NV12:YYYYYYYY UVUV-->YUV420SP
    • NV21:YYYYYYYY VUVU-->YUV420SP
    • RGB、YUV、YCbCr几种颜色空间的区别 : https://blog.csdn.net/leansmall/article/details/84262091

      最全流媒体协议详细总结介绍(RTP/RTCP/RTSP/RTMP/MMS/HLS/HTTP/ HTTP-FLV(HDL) /SDP)https://blog.csdn.net/xiaomucgwlmx/article/details/102851352

      Audio(音频):
    • MP3
    • mp4a/aac

      Video:
      H264
      HEVC

      Containers:
      flv
      mp4
      mkv(Matroska WebM)
      mov
      3gp

      Image:
      bmp
      jpg
      png
      gif

      Stream Media
      protocol:
      HTTP
      HLS
      RTMP
      http-flv(HDL)
      RTP、RTCP、RTSP
      P2P(UDP/TCP)
      non-proprietary formats such as MPEG-DASH
      CDN

      具体有哪些协议呢 ?
      1)音视频在传输前,怎么打包的,如:FLV,ts,mpeg4 等;
      2)直播推流,有哪些常见的协议,如:RTMP,RSTP 等;
      3)直播拉流,有哪些常见的协议,如:RTMP,HLS,HDL,RTSP 等;
      4)基于 UDP 的协议有哪些?如:RTP/RTCP,QUIC 等。
       

      Server:
      nginx-rtmp-module
      ----https://github.com/arut/nginx-rtmp-module
      srs
      ----https://github.com/winlinvip/srs
      easydarwin
      ----http://www.easydarwin.org/
      live555
      ----http://www.live555.com/

      Media Player:
      ffplay
      ----http://ffmpeg.org/
      vlc
      ----https://www.videolan.org/
      mplayer
      ----http://www.mplayerhq.hu/design7/news.html

      Web Media Player:
      SRS
      ----http://winlinvip.github.io/srs.release/trunk/research/players/srs_player.html

      Media OpenSource:
      ffmpeg
      ----http://ffmpeg.org/
      webrtc
      ----https://webrtc.org/
      kurento
      ----http://www.kurento.org/
      licode
      ----http://lynckia.com/licode/index.html
      gstreamer
      ----https://gstreamer.freedesktop.org/
      x264
      ----https://www.videolan.org/developers/x264.html
      fdk-aac
      ----https://github.com/mstorsjo/fdk-aac
      ----http://www.linuxfromscratch.org/blfs/view/svn/multimedia/fdk-aac.html
      librtmp
      ----http://rtmpdump.mplayerhq.hu/
      ijkplayer
      ----https://github.com/bilibili/ijkplayer
      VLC
      ----https://www.videolan.org/

      Client:
      FFmpeg
      Render(SDL、DirectX、OpenGL OpenGLES OpenSLES)
      Plugin(IE、Chrome、Firefox)
      Cloud Transcoding
      TV set(Set Top Box, STB)
      Mobile Device(Pad, Phone, Auto)

      Platform:
      linux
      android
      iOS
      Windows
      Mac Os

      可以测试的实时流地址,rtmp,hls:
      香港财经:rtmp://202.69.69.180:443/webcast/bshdlive-pc

韩国GoodTV:rtmp://mobliestream.c3tv.com:554/live/goodtv.sdp

湖南卫视:rtmp://58.200.131.2:1935/livetv/hunantv

http://playertest.longtailvideo.com/adaptive/bipbop/gear4/prog_index.m3u8

http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8

http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8


参考链接:
https://blog.csdn.net/qq_42510533/article/details/101775388
https://www.jianshu.com/p/fca1201d9067
福利贴:最全实时音视频开发要用到的开源工程汇总   http://www.52im.net/thread-1395-1-1.html 

Logo

致力于链接即构和开发者,提供实时互动和元宇宙领域的前沿洞察、技术分享和丰富的开发者活动,共建实时互动世界。

更多推荐