侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 352 篇文章
  • 累计创建 135 个标签
  • 累计收到 10 条评论

目 录CONTENT

文章目录

流媒体中推流与拉流的区别

孔子说JAVA
2022-09-30 / 0 评论 / 0 点赞 / 608 阅读 / 2,942 字 / 正在检测是否收录...
广告 广告

流媒体协议(Streaming Protocol)是一种用于通过 Web 传递多媒体的协议。每次观看直播或点播视频时,背后的技术就是流媒体协议。视频直播的基础服务是直播流的接入和分发服务。你可以使用推流地址通过推流工具将视频流推送至服务器,观众可以通过播放地址和播放器观看直播内容。

  • 推流:是把采集阶段封装好的音视频直播流推送到服务器的过程。
  • 拉流:是将第三方直播流地址拉取到服务器进行CDN内容分发,再推流至需要的节点的过程。
  • 播流:是将服务器直播服务中心已有直播内容,分发到播放器进行播放过程。

image-1664498916614

1、推流

将直播的内容推送至服务器的过程,即把采集阶段封包好的内容传输到服务器的过程。其实就是将现场的视频信号传到网络的过程。

  • “推流”对网络要求比较高,如果网络不稳定,直播效果就会很差,观众观看直播时就会发生卡顿等现象,观看体验很是糟糕。要想用于推流还必须把音视频数据使用传输协议进行封装,变成流数据。常用的流传输协议有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://开头,包含了上传服务器地址,上传目录名和上传节点,三部分组成。所有的rtmp地址都是这种结构组成,基本同一个平台不同直播的地址前两部分是不变的。推流码构成如下图:

image-1664498508290

推流过程示例图:

image-1664498574524

推流端的四个环节:

  • 首先是采集环节:采集是指对图像和声音的采集,简单说就是能让网络视频直播系统和主播摄像头连起来,软件能获取到外界的音视频信息。

    • 然后是前处理阶段:这里也是俗称美颜的阶段,这要求我们在网络视频直播系统中加入美颜、特效、萌颜等效果,而这个算法需要涉及到GPU编程,这个阶段的难点不在于美颜,因为美颜通常使用SDK来解决的,重点在于GPU占比。
  • 目前市面上的手机硬件配置已经越来越高了,但在一些老旧机型上,功耗仍然是个很大的问题,GPU占用太高会导致手机发烫、摄像头掉帧甚至软件闪退。

  • 接下来就是编码了,编码是为了压缩数据也是为了更好的解码,通常我们会选择用硬编码来平衡编码速度和编码质量之间的效率比,但软编仍然是画面质量更高的选择,也有用户愿意使用软编码的方式,因此在最初设计系统时,我们应当同时设计好软编硬编两种编码方式。

  • 推流端最后一个操作就是推流,把视频推流到服务器,以便于直播视频的分发和拉流,至此,主播端的全部设置就结束了,在这里有几点难点。

2、拉流

拉流是指服务器已有直播内容,根据协议类型(如RTMP、RTP、RTSP、HTTP等),与服务器建立连接并接收数据,进行拉取的过程。通俗易懂的讲就是讲我们的直播内容提供给第三方直播平台,第三方直播平台可以对我们的直播内容进行同步直播。

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

拉流端的三个环节:

  • 用户想看直播就要去服务器进行拉流,什么是拉流?你打开视频网站,点击视频,你点击视频和视频打开之间的时间段,就是你的客户端去向服务器请求拉流了,这一步要注意的是首屏开启时间,时间越短,观众越有可能被留下。

  • 有编码就要有解码,编码上会出现安卓适配问题,那解码上当然也会出现该问题,网络视频直播系统自带编解码程序的优势就在于它能够避免因手机机型不同,视频格式不同而产生的不同机型无法播放的情况。

    • 使用硬解码(对应系统的API)或软解码(FFMpeg)来解压音视频数据;经过解码后得到原始的视频数据(YUV)和音频数据(AAC);因为音频和视频解码是分开的,所以我们得把它们同步起来,否则会出现音视频不同步的现象,比如别人说话会跟口型对不上;
  • 渲染环节交给手机就可以了,把同步的音频数据送到耳机或外放,视频数据送到屏幕上显示,然后用户就可以进行观看了。

推流与拉流示意图:

image-1664498469467

3、流媒体协议与格式

image-1664499314195

RTMP推送协议(主流协议)

RTMP是Real Time Messaging Protocol(实时消息传输协议)的缩写,是Adobe公司为Flash/AIR平台和服务器之间音、视频及数据传输开发的实时消息传送协议。RTMP协议基于TCP,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。RTMP协议中,视频必须是H264编码,音频必须是AAC或MP3编码,且多以flv格式封包。RTMP是目前最主流的流媒体传输协议,对CDN支持良好,实现难度较低,是大多数的直播平台的选择。不过RTMP有着一个最大的不足——不支持浏览器,且Adobe已不再更新。因此直播服务要支持浏览器的话,需要另外的推送协议支持。

  • Adobe公司研发的实时消息传输协议
  • 基于TCP层协议
  • 视频必须是H264编码,音频必须是AAC或MP3编码,且多以flv格式封包
  • 目前最主流的流媒体传输协议,对CDN支持良好
  • 能在flash播放器上播放,不能在H5的video播放器上播放,且Adobe已不再更新

HLS推送协议

Http Live Streaming是由Apple公司定义的基于HTTP的流媒体实时传输协议。它的原理是将整个流分为多个小的文件来下载,每次只下载若干个。服务器端会将最新的直播数据生成新的小文件,客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。基本上,HLS是以点播的技术实现了直播的体验。因为每个小文件的时长很短,客户端可以很快地切换码率,以适应不同带宽条件下的播放。分段推送的技术特点,决定了HLS的延迟一般会高于普通的流媒体直播协议。传输内容包括两部分:一是M3U8描述文件,二是TS媒体文件。

  • Apple公司研发的流媒体实时传输协议
  • 基于HTTP层协议
  • 视频必须是H264编码,音频必须是AAC或MP3编码
  • 原理为整个流分为多个小的文件来下载,每次只下载若干个,相当于分段推送
  • 延迟一般会高于普通的流媒体直播协议

WebRTC推送协议

  • 开源的网页即时通信协议
  • 基于SRTP和UDP协议
  • 支持实时语音、视频对话的开源协议
  • 支持目前的主流浏览器
  • 实现点对点通信,通信双方延时低
0

评论区