音视频基础

写在前面

学习音视频基础的过程中了解到雷神,得知雷神陨落的消息有点莫名心酸,不禁叹息。13年的时候,我还是个初中生,前人已去,精神永存。这种对于技术的钻研和奉献精神将会一直激励着后来者,纪念雷神。雷霄骅
在这里插入图片描述

基础概念

音视频直播推流和拉流

为什么直播现场的信息,用户通过手机或者网站就能很快的看到呢?为什么有时候网络不稳定,直播效果会有延迟呢?现场的视频信号又是如何传到网络呢?这些所有问题的产生,都离不开视频直播中常说的两个词:推流和拉流。
在这里插入图片描述

什么是推流

推流,指的是把采集阶段封包好的内容传输到服务器的过程。其实就是将现场的视频信号传到网络的过程。“推流”对网络要求比较高,如果网络不稳定,直播效果就会很差,观众观看直播时就会发生卡顿等现象,观看体验很是糟糕。

要想用于推流还必须把音视频数据使用传输协议进行封装,变成流数据。常用的流传输协议有RTSP、RTMP、HLS等,使用RTMP传输的延时通常在1–3秒,对于手机直播这种实时性要求非常高的场景,RTMP也成为手机直播中最常用的流传输协议。最后通过一定的Qos算法将音视频流数据推送到网络断,通过CDN进行分发。

在直播场景中,网络不稳定是非常常见的,这时就需要Qos来保证网络不稳情况下的用户观看直播的体验,通常是通过主播端和播放端设置缓存,让码率均匀。另外,针对实时变化的网络状况,动态码率和帧率也是最常用的策略。

直播中使用广泛的“推流协议”一般是RTMP(Real Time Messaging Protocol——实时消息传输协议)。该协议是一个基于TCP的协议族,是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。支持该协议的软件包括Adobe Media Server/Ultrant Media Server/red5等。

什么是拉流

拉流是指服务器已有直播内容,根据协议类型(如RTMP、RTP、RTSP、HTTP等),与服务器建立连接并接收数据,进行拉取的过程。拉流端的核心处理在播放器端的解码和渲染,在互动直播中还需集成聊天室、点赞和礼物系统等功能。

拉流端现在支持RTMP、HLS、HDL(HTTP-FLV)三种协议,其中,在网络稳定的情况下,对于HDL协议的延时控制可达1s,完全满足互动直播的业务需求。RTMP是Adobe的专利协议,开源软件和开源库都支持的比较好,延时一般在1-3秒。HLS是苹果提出的基于HTTP的流媒体传输协议,优先是跨平台性比较好,HTML5可以直接打开播放,移动端兼容性良好,但是缺点是延迟比较高。
在这里插入图片描述

推流和拉流的区别

用户最终看到一条直播视频,可能会通过两种方式达成,一种是主动把内容传输到服务器,缓存在边缘节点,终端用户随时可以调取观看,这是推流;一种是当终端用户想要看某个内容时,将内容从源站调取,并缓存到边缘节点,这是拉流。

协议层、封装格式层、编解码层、像素层

在这里插入图片描述
rtmp:协议栈
H264:你可以这么理解,YUV或者RGB原始数据,编码后的数据
I420:原始的YUV数据
mp4、avi:容器,所谓容器,里面既有音频 也有视频。

RTP/RTCP/RTMP/RTSP区别

RTP(Real-time Transport Protocol)实时传输协议

用于Internet上针对多媒体数据流的一种传输层协议.RTP 协议和 RTP 控制协议 RTCP 一起使用,而且它是建立在 UDP 协议上的。RTP 不像http和ftp可完整的下载整个影视文件,它是以固定的数据率在网络上发送数据,客户端也是按照这种速度观看影视文件,当影视画面播放过后,就不可以再重复播放,除非重新向服务器端要求数据。

RTP一般不作为单独应用层协议处理,RTP传输音频/视频数据,如果是PLAY,Server发送到Client端,如果是RECORD,可以由Client发送到Server。整个RTP协议由两个密切相关的部分组成:RTP数据协议和RTP控制协议(即RTCP)

RTP的协议层次

RTP(实时传输协议),顾名思义它是用来提供实时传输的,因而可以看成是传输层的一个子层。下图给出了流媒体应用中的一个典型的协议体系结构。
在这里插入图片描述
从图中可以看出,RTP被划分在传输层,它建立在UDP上。同UDP协议一样,为了实现其实时传输功能,RTP也有固定的封装形式。RTP用来为端到端的实时传输提供时间信息和流同步,但并不保证服务质量。服务质量由RTCP来提供。

不少人也把RTP归为应用层的一部分,这是从应用开发者的角度来说的。操作系统中的TCP/IP等协议栈所提供的是我们最常用的服务,而RTP的实现还是要靠开发者自己。因此从开发的角度来说,RTP的实现和应用层协议的实现没不同,所以可将RTP看成应用层协议。

RTP实现者在发送RTP数据时,需先将数据封装成RTP包,而在接收到RTP数据包,需要将数据从RTP包中提取出来。

RTCP(Real-time Transport Control Protocol)实时传输控制协议

RTCP是实时传输协议(RTP)的一个姐妹协议。RTP 协议和 RTP控制协议(RTCP) 一起使用,而且它是建立在UDP协议上的(一般用于视频会议)。RTCP包括Sender Report和Receiver Report,用来进行音频/视频的同步以及其他用途,是一种控制协议

RTSP(Real Time Streaming Protocol)实时流传输协议

RTSP是 TCP/IP 协议体系中的一个应用层协议,是用来控制声音或影像的多媒体串流协议。该协议定义了一对多应用程序如何有效地通过 IP 网络传送多媒体数据。

RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或UDP完成数据传输。基于TCP的RTSP负责信令控制。总结起来为:RTSP传输一般使用UDP,信令交互采用TCP,协议基于TCP。

  • 走UDP协议:UDP负责传输单播中的MP2T/UDP、MP2T/RTP/UDP和组播流;
  • 走TCP协议:RTSP(TCP)负责传输MP2T/TCP、MP2T/RTP/TCP单播流;

HTTP与RTSP相比,HTTP传送HTML,而RTSP传送的是多媒体数据。HTTP请求由客户机发出,服务器作出响应;使用RTSP时,客户机和服务器都可以发出请求,即RTSP可以是双向的。
在这里插入图片描述

RTSP与RTP的区别

  • RTSP是一种双向实时数据传输协议,它允许客户端向服务器端发送请求,如回放、快进、倒退等操作。当然,RTSP 可基于 RTP 来传送数据,还可以选择TCP、UDP、组播UDP等通道来发送数据,具有很好的扩展性。它时一种类似与HTTP协议的网络应用层协议。
  • RTP是实时传输协议,一般不作为单独应用层协议处理;RTSP是实时流传输协议,它是与HTTP等级的应用层网络协议,它是由realmedia开发,用来传输流媒体影像文件。
  • RTSP发起/终结流媒体、RTP传输流媒体数据 、RTCP对RTP进行控制、同步
  • RTSP可基于RTP之上,比如常见的视频流传输过程:视频压缩文件->RTP打包->基于UDP的RTSP网络传输;也可以不做成RTP包,直接基于UDP传送,如视频压缩文件->基于UDP的RTSP网络传输。

媒体数据使用RTP、RTCP协议一般使用UDP作为传输层。适合IPTV场景。数据源包括现场数据与存储在剪辑中的数据。该协议目的在于控制多个数据发送连接,为选择发送通道,如UDP、多播UDP与TCP提供途径,并为选择基于RTP上发送机制提供方法传输时所用的网络通讯协定并不在其定义的范围内,服务器端可以自行选择使用TCP或UDP来传送串流内容,比较能容忍网络延迟。

RTMP(Real Time Message Protocol)实时消息传输协议

RTMP是Macromedia 开发的一套视频直播协议,现在属于 Adobe。和HLS一样都可以应用于视频直播,基于TCP不会丢失,默认使用端口1935。RTMP是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。

RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题,优势在于低延迟,稳定性高,支持所有摄像头格式,浏览器加载 flash插件就可以直接播放

RTMP基于flash无法在 iOS的浏览器里播放,但是实时性比 HLS 要好。是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的开放协议。iOS 代码里面一般常用的是使用 RTMP 推流,可以使用第三方库 librtmp-iOS 进行推流,librtmp 封装了一些核心的 API 供使用者调用。

RTSP、RTMP和HTTP

  • HTTP:即超文本传送协议(FTP即文件传输协议)
  • RTSP:(Real Time Streaming Protocol)实时流传输协议
  • RTMP:(Real Time Message Protocol)实时消息传输协议
共同点
  • RTSP RTMP HTTP都是在应用应用层。
  • 理论上RTSP 、RTMP、 HTTP都可以做直播和点播,但一般做直播用RTSP RTMP,做点播用HTTP。做视频会议的时候原来用SIP协议,现在基本上被RTMP协议取代了。
区别
  • HTTP将所有的数据作为文件做处理。HTTP协议不是流媒体协议。RTMP和RTSP协议是流媒体协议。
  • RTMP协议是Adobe的私有协议,未完全公开。RTSP协议和HTTP协议是共有协议,并有专门机构做维护。
  • 流格式不同。RTMP协议一般传输的是flv,f4v格式流。RTSP协议一般传输的是ts,mp4格式的流。RTSP传输一般需要2-3个通道,命令和数据通道分离,HTTP和RTMP一般在TCP一个通道上传输命令和数据。
  • 对网络要求不同。RTSP+RTP主要用于IPTV或低延迟场景,比如监控摄像头,传输数据使用的是UDP或TCP,在网络环境比较稳定的情况下,传输效率是比较高的;RTMP主要用于互联网音视频传输,它使用的是TCP传输,因为互联网环境相对较差,采用RTMP保证了视频的传输质量,但是其传输延迟相对较高,传输效率相对较低。
  • RTSP虽然实时性最好,但是实现复杂,适合视频聊天和视频监控;RTMP强在浏览器支持好,加载flash插件后就能直接播放,所以非常火,相反在浏览器里播放rtsp就很困难了。

基于TS的传输协议栈

在这里插入图片描述

TS流与RTSP流的区别

  • 首先RTSP是实时流传输协议,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学、网景和RealNetworks公司提交的IETF RFC标准。该协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或RTP完成数据传输。
  • TS流:这个是MPEG国际组织规定的音视频封装的标准,机顶盒接收的都是这种格式的数据。DVB-T、DVB-S、DVB-C(地面机顶盒、卫星机顶盒、有线机顶盒)解析的都是TS流数据

HLS(HTTP Live Streaming)基于HTTP的流媒体网络传输协议

HLS是苹果公司提出的动态码率自适应技术。主要用于PC和Apple终端的音视频服务。

HLS协议是苹果推出的解决方案,将视频分成5-10秒的视频小分片,然后用m3u8索引表进行管理,由于客户端下载到的视频都是5-10秒的完整数据,故视频的流畅性很好,但也同样引入了很大的延迟(HLS的一般延迟在10-30s左右)。

HLS协议客户端支持简单, 只需要支持 HTTP 请求即可, HTTP 协议无状态, 只需要按顺序下载媒体片段即可,而且网络兼容性好, HTTP 数据包也可以方便地通过防火墙或者代理服务器。

HLS主要是延时比较大,RTMP主要优势在于延时低。HLS可以用在IOS系统的APP上,微信公众号、小程序等也只能使用HLS。直播应用中,RTMP和HLS基本上可以覆盖所有客户端观看。

拓展:编码、封装

编码格式:
支持H.265、H.264、MPEG4、MJPEG等多种编码格式;

封装格式:
支持PS、RTP、TS、ES等主流的封装格式;

物理景象被IPC(编码设备)转换为数字信息,例如

  • 编码
    IPC(编码设备)先拍照,再将图片按照“H.265、H.264、MPEG4、MJPEG等多种编码格式”中其中一种格式的标准转换为机器数据
  • 封装
    IPC(编码设备)将一串编码数据(可能是一张图片,也可能是多张图片)按照“PS、RTP、TS、ES等主流的封装格式”中一个格式的标准,加上封装头,再进行传输
    封装头的好处:便于解码器解码,例如告诉解码器这段数据的编码标准、分辨率等等信息

FFmpeg

简介

FFmpeg即是一款音视频编解码工具,同时也是一组音视频编码开发套件,作为编码开发套件,它为开发者提供了丰富的音视频处理的调用接口。

FFmpeg提供了多种媒体格式的封装和解封装,包括多种音视频编码、多种协议的流媒体、多种多彩格式转换、多种采样率转换、多种码率转换等;FFmpeg框架提供了多种丰富的插件模块,包含封装与解封装的插件、编码与解码的插件等。

FFmpeg基本组成

FFmpeg框架的基本组成包含AVFormat、AVCodec、AVFilter、AVDevice、AVUtil等模块库,结构图如下:
在这里插入图片描述

AVFormat–FFmpeg的封装模块
AVFormat中实现了目前多媒体领域中的绝大多数媒体封装格式,包括封装和解封装,如MP4、FLV、KV、TS等文件封装格式,RTMP、RTSP、MMS、HLS等网络协议封装格式。FFmpeg是否支持某种媒体封装格式,取决于编译时是否包含了该格式的封装库。根据实际需求,可进行媒体封装格式的扩展,增加自己定制的封装格式,即在AVFormat中增加自己的封装处理模块。

AVCodec–FFmpeg的编解码模块
AVCodec中实现了目前多媒体领域绝大多数常用的编解码格式,即支持编码,也支持解码。AVCodec除了支持MPEG4、AAC、MJPEG等自带的媒体编解码格式之外,还支持第三方的编解码器,如H.264(AVC)编码,需要使用x264编码器;H.265(HEVC)编码,需要使用x264编码器;MP3(mp3lame)编码,需要使用libmp3lame编码器。如果希望增加自己的编码格式,或者硬件编解码,则需要在AVCodec中增加相应的编解码模块。

AVFilter–FFmpeg的滤镜模块
AVFilter库提供了一个通用的音频、视频、字幕等滤镜处理框架。在AVFilter中,滤镜框架可以有多个输入和多个输出。

swresample–FFmpeg的音频转换计算模块
swresample模块提供了高级别的音频重采样API。例如允许操作音频采样、音频通道布局转换与布局调整。

swscale–FFmpeg的视频图像转换计算模块
swscale模块提供了高级别的图像转换API,例如它允许进行图像缩放和像素格式转换,常见于将图像从1080p转换成720p或者480p等的缩放,或者将图像数据从YUV420p转换成YUYV,或者YUV转RGB等图像格式转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一只嵌入式爱好者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值