一、RTMP 播放器概述
(一)RTMP 播放器的定义与作用
RTMP 播放器是一种专门用于播放采用 RTMP(Real Time Messaging Protocol)协议的视频流的工具。在当今的流媒体播放领域中,它扮演着至关重要的角色。RTMP 播放器能够实时接收、解码和播放来自服务器的音频、视频数据,为用户提供流畅的观看体验。
在直播场景中,RTMP 播放器能够实现低延迟播放,让观众与主持人之间的互动更加及时。例如,在会议类直播中,参会者可以通过文字聊天与主讲人互动,而 RTMP 播放器的低延迟特性能够确保观众的评论和主讲人的回应之间的时间差尽可能小。在视频会议中,RTMP 播放器可以保证参会人员之间的交流顺畅,减少因延迟带来的沟通障碍。对于监控领域,RTMP 播放器能够实时显示监控画面,帮助相关人员及时发现问题并采取措施。
二、常见 RTMP 播放器推荐
(一)FFMPEG
FFMPEG 是一套开源计算机程序,采用 LGPL 或 GPL 许可证。它包含非常先进的音频 / 视频编解码库 libavcodec,为保证高可移植性和编解码质量,很多 codec 都是从头开发的。支持的格式众多,如 ASF、AVI、BFI、IFF 等。在点播播放中,文件格式支持很全面,但维护成本很高。
(二)大牛直播 SDK
”大牛直播SDK”,始于2015年,致力于传统行业极致体验的音视频直播技术解决方案,产品涵盖跨平台的实时RTMP推流、RTMP/RTSP直播播放(支持RTSP|RTMP H.265,Enhanced RTMP H.265)、GB28181设备接入、推送端播放端实时录像、多路流媒体转发(RTSP转RTMP,RTMP转RTMP,RTSP|RTMP转GB28181)、音视频导播、动态视频合成、音频混音、一对一互动直播、内置轻量级RTSP服务、RTSP网关服务等,比快更快,业界真正稳定可靠的超低延迟直播SDK(毫秒级延迟,低延迟模式下150~300ms)。
(三)Vitamio
Vitamio 是一款 Android 与 iOS 平台上的全能多媒体开发框架,全面支持硬件解码与 GPU 渲染。能够流畅播放 720P 甚至 1080P 高清视频,跨平台支持 MMS、RTSP、RTMP、HLS 等多种视频流媒体协议。但貌似已不维护了。
(四)Potplayer 和 VLC
在 Windows 平台上,Potplayer 和 VLC 都是比较常见的播放器。Potplayer 功能强大,支持多种格式播放,但对部分 h265 编码的流媒体直播源支持不友好,可能只有声音而看不到画面。VLC 是自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件及各种流媒体协议,但功能相对单一,同样对部分 h265 编码直播源支持不佳。
三、RTMP 播放器的特点
(一)低延迟优势
RTMP 在低延时应用场景中具有重要地位。在互动式直播中,观众与主讲人的互动需要及时响应,RTMP 的低延迟特性(一般在3-5秒,像大牛直播SDK全自研内核框架的延迟可以做到150-300ms)使得这种互动更加流畅自然。相比之下,HTTP 流的延时一般在 10 秒以上,明显不适合互动式直播的需求。在视频会议中, RTMP 的低延迟仍能保证参会人员之间的交流更加顺畅,减少因延迟带来的沟通障碍。
(二)功能特性
以大牛直播SDK的RTMP播放器模块设计为例,功能设计如下:
如不单独说明,系Windows、Linux(含x86_64|aarch64)、Android、iOS全平台支持。
- [多实例播放]支持多实例播放;
- [事件回调]支持网络状态、buffer状态等回调;
- [视频格式]支持RTMP扩展H.265和Enhanced RTMP H.265,H.264;
- [音频格式]支持AAC/PCMA/PCMU/Speex;
- [H.264/H.265软解码]支持H.264/H.265软解;
- [H.264硬解码]Windows/Android/iOS支持特定机型H.264硬解;
- [H.265硬解]Windows/Android/iOS支持特定机型H.265硬解;
- [H.264/H.265硬解码]Android支持设置Surface模式硬解和普通模式硬解码;
- [缓冲时间设置]支持buffer time设置;
- [首屏秒开]支持首屏秒开模式;
- [低延迟模式]支持低延迟模式设置(公网200~400ms);
- [复杂网络处理]支持断网重连等各种网络环境自动适配;
- [快速切换URL]支持播放过程中,快速切换其他URL,内容切换更快;
- [音视频多种render机制]Android平台,视频:SurfaceView/GLSurfaceView,音频:AudioTrack/OpenSL ES;
- [实时静音]支持播放过程中,实时静音/取消静音;
- [实时音量调节]支持播放过程中实时调节音量;
- [实时快照]支持播放过程中截取当前播放画面;
- [只播关键帧]Windows平台支持实时设置是否只播放关键帧;
- [渲染角度]支持0°,90°,180°和270°四个视频画面渲染角度设置;
- [渲染镜像]支持水平反转、垂直反转模式设置;
- [等比例缩放]支持图像等比例缩放绘制(Android设置surface模式硬解模式不支持);
- [实时下载速度更新]支持当前下载速度实时回调(支持设置回调时间间隔);
- [ARGB叠加]Windows平台支持ARGB图像叠加到显示视频(参看C++的DEMO);
- [解码前视频数据回调]支持H.264/H.265数据回调;
- [解码后视频数据回调]支持解码后YUV/RGB数据回调;
- [解码后视频数据缩放回调]Windows平台支持指定回调图像大小的接口(可以对原视图像缩放后再回调到上层);
- [解码前音频数据回调]支持AAC/PCMA/PCMU/SPEEX数据回调;
- [音视频自适应]支持播放过程中,音视频信息改变后自适应;
- [扩展录像功能]完美支持和录像SDK组合使用。
(三)GOP-Cache 和累积延迟
GOP(Group of Pictures)即视频流中两个 I 帧的时间距离。Flash(解码器)只有拿到 GOP 才能开始解码播放。服务器一般先给一个 I 帧给 Flash。假设 GOP 是 10 秒,即每隔 10 秒才有关键帧,如果用户在第 5 秒时开始播放,会有两种方案。第一种方案是等待下一个 I 帧,再等 5 秒才开始给客户端数据,这样延迟低,但会黑屏等待。第二种方案是马上播放前一个 I 帧,这样可以快速启动,但延迟会增大。
累积延迟是 RTMP 的一个问题。因为 RTMP 基于 TCP 不会丢包,当网络状态差时,服务器会将包缓存起来,导致累积的延迟。处理累积延迟的方法有多种。例如,客户端检测到缓冲区有很多数据时,可以重连服务器。此外,还可以通过调整服务器的直播队列长度、编码器调低 GOP 等方法来降低延迟。例如,编码器调低 GOP 到 0.5 秒一个 GOP,这样延迟也很低,也不用等待,但编码器压缩率会降低,图像质量没有那么好。
四、如何使用 RTMP 播放器
以大牛直播SDK的Windows端RTMP播放器集成为例,上图是大牛直播SDK的Android端启动RTSP服务和推送RTMP流,然后Windows端分别播放RTSP和RTMP流的延迟情况(右侧是RTMP流)。
- demo 说明:
- 提供 C++/C# 两套接口,对外提供 32/64 位 debug/release 库,C++ 和 C# 接口一一对应,C# 接口比 C++ 接口增加前缀 NT_PB_。
- 播放端 SDK 支持 Win7 及以上系统,本 demo 基于 VS2013 开发。
- 展示了界面 UI,包括链接状态、下载速度、缓冲状态等信息。
- 集成说明:
- C++ 头文件和 C# 头文件的相关定义。
- 集成步骤包括拷贝库文件、设置授权、添加头文件等。
- 正式授权版需要在 Init () 接口调用之前添加设置 license 的代码。
- 接口调用时序(以 C# 为例):
- 设置授权 license。
- 设置日志存放路径。
- 初始化 SDK。
- 特定机型硬解码检测,可检测系统是否支持硬解,如需使用硬解码可调用相关接口。
- Open 生成播放实例,每调用一次 Open 接口对应一个播放实例。
- 设置回调事件,包括网络链接状态、buffer 状态、实时带宽等回调,以及视频分辨率回调、YUV/RGB32 数据回调等。
- D3DRender 检测,检测系统是否支持 D3D 绘制,对于不支持的情况可设置回调 YUV 数据,用 GDI 模式绘制,但 GDI 绘制效率偏低。
- 设置播放 URL,支持 rtsp/rtmp/ 本地 FLV 文件。
- 设置回调 PCM。
- RTMP/RTSP 播放参数设置,包括设置缓冲大小、RTSP TCP 模式、超时时间、自动切换 TCP/UDP、秒开、低延时模式、下载速度上报等。
- 开始播放 RTMP 或 RTSP 流数据。
- RTMP/RTSP 拉流端录像,包括设置录像目录、单个文件最大大小、文件名生成规则、录像回调接口、音频转 AAC 编码开关、是否录视频和音频等,并可启动和停止录像。
- 实时快照,用于播放端实时截取当前播放图片,图片以 PNG 形式保存至本地。
- 快速切换 URL,用于实时切换播放的 URL。
- 用户数据回调和 SEI 数据回调,如不需要处理相关数据,此接口无需调用。
- 停止播放和关闭播放实例。
- Uninit,是 SDK 最后一个调用的接口,多实例环境下只需要调用一次。