RTMP播放器全解析
一、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 最后一个调用的接口,多实例环境下只需要调用一次。
相关文章:

RTMP播放器全解析
一、RTMP 播放器概述 (一)RTMP 播放器的定义与作用 RTMP 播放器是一种专门用于播放采用 RTMP(Real Time Messaging Protocol)协议的视频流的工具。在当今的流媒体播放领域中,它扮演着至关重要的角色。RTMP 播放器能够…...
定期清洗ip是为了什么?怎么清洗iip
定期清洗IP(也称为“IP清理”)的目的是确保使用的IP池保持高效、可靠、安全,避免因使用无效或被封禁的IP导致网络操作失败。尤其在数据爬取、负载均衡等使用代理的场景中,定期清洗IP有助于提升整体的性能和数据抓取成功率。 定期…...

谁能给我一个ai现在无法替代画师的理由?
小白可做!全自动AI影视解说一键成片剪辑工具https://docs.qq.com/doc/DYnl6d0FLdHp0V2ll 如何看待现如今的AI绘画 哎呀玫瑰花来了,所有花式都要玩完了。 我相信大家在网上已经看过了太多惊为天人的AI绘画作品,有人抵制,有人支持&a…...

深入理解MySQL InnoDB中的B+索引机制
目录 一、InnoDB中的B 树索引介绍 二、聚簇索引 (一)使用记录主键值的大小进行排序 页内记录排序 页之间的排序 目录项页的排序 (二)叶子节点存储完整的用户记录 数据即索引 自动创建 (三)聚簇索引…...
语言的输入
编程语言提供最基本的输入输出,输入一个预期的数据也不是看起来那么简单,如下一一展开。 不同输入形式 C语言scanf提供格式串输入,程序员负责配置正确的格式,比如%d整型,%s为字符串。可能出现格式串和变量格式、个数不…...

2024年中国电子学会青少年软件编程(Python)等级考试(二级)核心考点速查卡
考前练习 2024年03月中国电子学会青少年软件编程(Python)等级考试试卷(二级)答案 解析 2024年06月中国电子学会青少年软件编程(Python)等级考试试卷(二级)答案 解析 知识点描述 …...

OpenCV系列教程二:基本图像增强(数值运算)、滤波器(去噪、边缘检测)
文章目录 一、基本图像增强(数值运算)1.1 加法 (cv2.add)1.1.1 图像与标量相加(调节亮度)1.1.2 图像与图像相加(两个图像shape要相同)1.1.3 图像的加权加法(渐变切换&…...

什么是文件完整性监控(FIM)
组织经常使用基于文件的系统来组织、存储和管理信息。文件完整性监控(FIM)是一种用于监控和验证文件和系统完整性的技术,识别用户并提醒用户对文件、文件夹和配置进行未经授权或意外的变更是 FIM 的主要目标,有助于保护关键数据和…...

分库分表还是分布式?如何用 OceanBase的单机分布式一体化从根本上解决问题
随着企业业务规模的不断增长,单机集中式的数据库系统逐渐难以承载企业日益增长的数据存储与处理需求。因此,MySQL 的分库分表方案成为了众多企业应对数据存储量激增及数据处理能力需求扩张的“止痛药”。尽管这一方案短期内有效缓解了企业面临的大规模数…...

怎么查看网站是否被谷歌收录,哪些因素影响着网站是否被谷歌收录
一、怎么查看网站是否被谷歌收录 查看网站是否被谷歌收录,有多种方法可供选择,以下是几种常用的方式: 1.使用“site:”指令: 在谷歌搜索引擎的搜索框中输入“site:你的域名网址”(注意使用英文冒号&#x…...

【RabbitMQ】面试题
在本篇文章中,主要是介绍RabbitMQ一些常见的面试题。对于前几篇文章的代码,都已经在码云中给出,链接是mq-test: 学习RabbitMQ的一些简单案例 (gitee.com),如果存在问题的话欢迎各位提出,望共同进步。 MQ的作用以及应用…...
Python软体中使用TensorFlow实现一个简单的神经网络:从零开始
使用TensorFlow实现一个简单的神经网络:从零开始 在现代数据科学和机器学习领域,神经网络是一个强大的工具。TensorFlow是一个广泛使用的开源库,专门用于机器学习和深度学习。本文将详细介绍如何使用TensorFlow实现一个简单的神经网络。我们将从基础概念开始,逐步深入到代…...

StopWath,apache commons lang3 包下的一个任务执行时间监视器的使用
StopWath是 apache commons lang3 包下的一个任务执行时间监视器,与我们平时常用的秒表的行为比较类似,我们先看一下其中的一些重要方法: <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <dependen…...

ELMO理论
目录 1 优点 2 缺点 3.知识点个人笔记 2018年3月份,ELMo出世,该paper是NAACL18 Best Paper。在之前2013年的word2vec及2014年的GloVe的工作中,每个词对应一个vector,对于多义词无能为力。ELMo的工作对于此,提出了一…...
EMU 街机模拟器编译方法
安装ubuntu 16.04 下载gcc 8.2 安装 然后安装automake 1.16 ,1.15 安装jdk8 sdk 里面配套的ndk 21e 编译库 cd ~/emu-ex-plus-alpha/imagine/bundle/all/ export IMAGINE_PATH/home/lxm/emu-ex-plus-alpha/imagine export ANDROID_SDK_ROOT/home/lxm/Sdk export ANDROID_NDK_…...
c++开发之编译curl(windows版本)
在 Windows 上编译支持 OpenSSL 的 cURL 库并不简单,因为涉及到多个库的依赖关系以及工具链的配置。以下是编译支持 OpenSSL 的 cURL 库的详尽步骤: 环境要求 编译工具链: MinGW 或 Visual StudioCMakePerl (用于编译 OpenSSL)NASM (用于编译…...

IT运维挑战与对策:构建高效一体化运维管理体系
在当今数字化时代,IT运维作为企业运营的核心支撑,其重要性不言而喻。然而,随着业务规模的扩大和技术的不断革新,IT运维团队面临着前所未有的挑战。本文旨在深度剖析当前IT运维中存在的主要问题,并探索一体化解决方案&a…...

前海石公园的停车点探寻
前海石公园是真的很美,很多看海人,很多钓鱼佬,很多抓螃蟹的人,很多挖沙子的人,很多拍照的人,尤其是没有大太阳的时间段或每天傍晚或每个放假的时候人气超高,故前海石公园停车真的很紧张。由于前…...
嵌入式学习--线性表Day01
嵌入式学习--线性表Day01 顺序表 1.1数组的插入、删除操作 1.2修改为last版本 1.3顺序表相关操作 顺序表、单向链表、单向循环链表、双向链表、双向循环链表、顺序栈、链式栈、循环队列(顺序队列)、链式队列 1)逻辑结构:线性结构 …...
Rust 全局变量的最佳实践 lazy_static/OnceLock/Mutex/RwLock
在实际项目开发中,难免需要用到全局变量,比如全局配置信息,全局内存池等,此类数据结构可能在多处需要被使用,保存为全局变量可以很方便的进行修改与读取。 在Rust中,如果只是读取静态变量是比较简单的&…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...

消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...

uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...