当前位置: 首页 > article >正文

Android 平台RTSP/RTMP播放器SDK接入说明

一、技术背景

自2015年起,大牛直播SDK持续深耕音视频直播领域,自主研发并迭代推出跨平台 RTSP/RTMP 播放模块,具备如下核心优势:

  • 全平台兼容:支持 Android/iOS/Windows/Linux 等主流系统;

  • 超低延迟:公网端到端延迟可低至 100ms~250ms;

  • 性能强劲:CPU 占用低,解码效率高;

  • 稳定性高:适配复杂网络环境,支持自动重连、快照、断网恢复等能力;

  • 接口全面:支持软硬解、数据回调、多实例、实时截图、录像等。

本文将以 Android 平台为例,详解如何对接并使用大牛直播 RTSP/RTMP 播放模块(SmartPlayerV2)。


二、系统要求

项目支持情况
Android系统Android 5.1 及以上版本
架构支持armv7, arm64, x86, x86_64
渲染机制SurfaceView / OpenGL ES / TextureView

三、准备工作

华为HONOR X10同时播放4路1080P RTSP流

1. 引入资源文件

将以下资源文件集成至工程:

文件名称说明
SmartPlayer.jar上层接口封装,放入 libs/ 目录
SmartPlayerJniV2.javaJNI 接口桥接类,建议放入 com.daniulive.smartplayer 包下
SmartPlayer.java上层封装类,用于统一操作
libSmartPlayer.soC++ 播放内核,放入对应架构 jniLibs

2. 权限配置(AndroidManifest.xml)

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

3. 加载 native 库

static {System.loadLibrary("SmartPlayer");
}

4. Gradle ABI 配置

splits {abi {enable truereset()include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'universalApk true}
}

5. app_name 配置(授权验证)

<string name="app_name">SmartPlayerSDKDemo</string>

四、核心接口说明(SmartPlayerJniV2)

1. 初始化与控制流程

接口说明
SmartPlayerOpen创建播放器实例,返回句柄
SmartPlayerSetUrl设置播放 URL(RTSP/RTMP)
SmartPlayerStartPlay启动播放
SmartPlayerStopPlay停止播放
SmartPlayerClose释放播放器实例

2. 解码与渲染配置

接口说明
SetSmartPlayerVideoHWDecoder设置 H.264 硬解模式
SetSmartPlayerVideoHevcHWDecoder设置 H.265 硬解模式
SmartPlayerSetSurface绑定 Surface 用于画面显示
SmartPlayerSetHWRenderMode设置 MediaCodec 绘制(兼容性更高)
SmartPlayerSetRenderScaleMode设置画面缩放填充模式(1为等比)
SmartPlayerSetSurfaceRenderFormatSurfaceView 渲染格式
SmartPlayerSetSurfaceAntiAlias开启抗锯齿(性能损耗,谨慎使用)

3. 网络与播放优化

接口说明
SmartPlayerSetBuffer设置播放缓存(单位:ms)
SmartPlayerSetFastStartup启用首屏秒开
SmartPlayerSetLowLatencyMode启用低延迟模式
SmartPlayerSwitchPlaybackUrl快速切换播放 URL
SmartPlayerSetRTSPTcpMode设置 RTSP TCP 模式
SmartPlayerSetRTSPTimeout设置 RTSP 超时时间(单位:秒)
SmartPlayerSetRTSPAutoSwitchTcpUdp自动 TCP/UDP 切换
DisableEnhancedRTMP禁用 Enhanced RTMP 支持

4. 音视频控制与扩展功能

接口说明
SmartPlayerSetMute实时静音
SmartPlayerSetAudioVolume设置音量(0~100)
CaptureImage实时截图(支持 JPEG/PNG)
SmartPlayerSetRotation视频旋转(0/90/180/270°)
SmartPlayerSetFlipHorizontal水平镜像
SmartPlayerSetFlipVertical垂直镜像
SmartPlayerSetExternalRender回调解码后 YUV/RGB 数据供自定义渲染
SmartPlayerSetExternalAudioOutput音频数据回调
SmartPlayerSetAudioOutputType选择音频输出类型(AudioTrack/OpenSL)

五、播放流程参考(Java 示例)

1. 创建播放器并初始化配置

SmartPlayerJniV2 libPlayer = new SmartPlayerJniV2();
long playerHandle = libPlayer.SmartPlayerOpen(getApplicationContext());
libPlayer.SmartPlayerSetUrl(playerHandle, "rtmp://xxx/live/stream");
libPlayer.SmartPlayerSetBuffer(playerHandle, 300);
libPlayer.SmartPlayerSetLowLatencyMode(playerHandle, 1);
libPlayer.SmartPlayerSetSurface(playerHandle, surfaceView);
libPlayer.SmartPlayerStartPlay(playerHandle);

2. 设置播放事件监听

class EventHandeV2 implements NTSmartEventCallbackV2 {@Overridepublic void onNTSmartEventCallbackV2(long handle, int id, long param1,long param2, String param3, String param4, Object param5) {//Log.i(TAG, "EventHandeV2: handle=" + handle + " id:" + id);String player_event = "";switch (id) {case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_STARTED:player_event = "开始..";break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_CONNECTING:player_event = "连接中..";break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_CONNECTION_FAILED:player_event = "连接失败..";break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_CONNECTED:player_event = "连接成功..";break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_DISCONNECTED:player_event = "连接断开..";break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_STOP:player_event = "停止播放..";break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_RESOLUTION_INFO:player_event = "分辨率信息: width: " + param1 + ", height: " + param2;break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_NO_MEDIADATA_RECEIVED:player_event = "收不到媒体数据,可能是url错误..";break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_SWITCH_URL:player_event = "切换播放URL..";break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_CAPTURE_IMAGE:player_event = "快照: " + param1 + " 路径:" + param3;if (param1 == 0)player_event = player_event + ", 截取快照成功";elseplayer_event = player_event + ", 截取快照失败";if (param4 != null && !param4.isEmpty())player_event += (", user data:" + param4);break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_RECORDER_START_NEW_FILE:player_event = "[record]开始一个新的录像文件 : " + param3;break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_ONE_RECORDER_FILE_FINISHED:player_event = "[record]已生成一个录像文件 : " + param3;break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_START_BUFFERING:Log.i(TAG, "Start Buffering");break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_BUFFERING:Log.i(TAG, "Buffering:" + param1 + "%");break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_STOP_BUFFERING:Log.i(TAG, "Stop Buffering");break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_DOWNLOAD_SPEED:player_event = "download_speed:" + param1 + "Byte/s" + ", "+ (param1 * 8 / 1000) + "kbps" + ", " + (param1 / 1024)+ "KB/s";break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_RTSP_STATUS_CODE:Log.e(TAG, "RTSP error code received, please make sure username/password is correct, error code:" + param1);player_event = "RTSP error code:" + param1;break;}if (player_event.length() > 0) {Log.i(TAG, player_event);Message message = new Message();message.what = PLAYER_EVENT_MSG;message.obj = player_event;handler.sendMessage(message);}}
}

3. 停止与释放资源

libPlayer.SmartPlayerStopPlay(playerHandle);
libPlayer.SmartPlayerClose(playerHandle);

六、多实例播放封装(LibPlayerWrapper)

推荐封装 SmartPlayer 播放实例为 LibPlayerWrapper 类,实现多实例管理、资源释放、播放状态判断等能力,便于集成。

封装内容包括:

  • 打开与关闭播放器

  • 设置 Surface/播放参数

  • 启动/停止播放

  • 设置静音、音量、截图等控制

详见源码文件 LibPlayerWrapper.java


七、附录:支持功能一览

  • 支持协议:RTMP、RTSP(含鉴权、TCP/UDP)

  • 音频编码:AAC、Speex、PCMA、PCMU

  • 视频编码:H.264、H.265

  • 渲染方式:SurfaceView/OpenGL ES/TextureView

  • 解码方式:软解、硬解(支持自动降级)

  • 回调接口:解码前、解码后、下载速度、事件状态

  • 附加能力:截图、旋转、镜像、切流、低延迟播放、首屏秒开、多实例支持、录像功能扩展


八、总结

本文全面介绍了大牛直播 SDK 在 Android 平台下的 RTSP/RTMP 播放模块集成方式,重点涵盖依赖配置、接口调用、播放控制、多实例封装等内容。SmartPlayer 播放模块具备超低延迟、高稳定性、强兼容性与良好扩展性,适用于安防监控、远程教育、互动直播、工业图传等多个领域。

相关文章:

Android 平台RTSP/RTMP播放器SDK接入说明

一、技术背景 自2015年起&#xff0c;大牛直播SDK持续深耕音视频直播领域&#xff0c;自主研发并迭代推出跨平台 RTSP/RTMP 播放模块&#xff0c;具备如下核心优势&#xff1a; 全平台兼容&#xff1a;支持 Android/iOS/Windows/Linux 等主流系统&#xff1b; 超低延迟&#…...

Nodejs工程化实践:构建高性能前后端交互系统

一、工程架构设计 1.1 现代化项目初始化 采用多包管理架构&#xff1a; mkdir content-platform && cd content-platform npm init -y npx lerna init mkdir -p {packages/client,packages/server,packages/shared} 关键模块划分&#xff1a; client/: 基于Next.js…...

STM32什么是寄存器

提示&#xff1a;文章 文章目录 前言一、背景二、2.12.2 三、3.1 总结 前言 前期疑问&#xff1a; 1、什么是寄存器&#xff1f; 答&#xff1a;在4GB的地址空间中&#xff0c;512MB的block2上&#xff0c;每4个字节组成32位&#xff0c;这个32位为一个单元&#xff0c;控制&a…...

Linux 的 find 命令使用指南

精通 Linux 的 find 命令:终极使用指南 在 Linux 系统中,find 命令是文件搜索的瑞士军刀,它能基于多种条件在目录树中精准定位文件。无论你是系统管理员还是开发者,掌握 find 都能极大提升工作效率。本文将深入解析 find 的核心用法,并附赠实用示例! 一、基础语法结构 …...

第六个微信小程序:教师工具集

源于工作需要&#xff0c;下面开始。 安装及使用 | Taro 文档 vscode 代码管理 git 辅助 开发技术如上&#xff1a; 1.开始创建模板 taro4.1.1 $ taro init teachers-tools 2.用vsocde开始吧。 选择 第二个文件夹找一。 (base) PS D:\react\teachers-tools> pnpm…...

记录一个用了很久的git提交到github和gitee比较方便的方法

在当前git init后&#xff0c;在隐藏的git文件夹中找到config文件 [user]name thels [remote "github"]url your github repository urlfetch refs/heads/*:refs/remotes/origin/* [remote "gitee"]url your gitee repository urlfetch refs/heads/*:…...

Qt Qml模块功能及功能解析

QtQml 是 Qt 6.0 中用于声明式 UI 开发和应用程序逻辑的核心模块&#xff0c;它提供了 QML 语言的支持和运行时环境。 一、主要功能 1. QML 语言支持 QML 语法解析&#xff1a;支持 QML (Qt Meta-Object Language 或 Qt Modeling Language) 的完整语法 JavaScript 集成&…...

前端八股之JS的原型链

1.原型的定义 每一个对象从被创建开始就和另一个对象关联&#xff0c;从另一个对象上继承其属性&#xff0c;这个另一个对象就是 原型。 当访问一个对象的属性时&#xff0c;先在对象的本身找&#xff0c;找不到就去对象的原型上找&#xff0c;如果还是找不到&#xff0c;就去…...

NLP学习路线图(二十九):BERT及其变体

在自然语言处理(NLP)领域,一场静默的革命始于2017年。当谷歌研究者发表《Attention is All You Need》时,很少有人预料到其中提出的Transformer架构会彻底颠覆NLP的发展轨迹,更催生了以GPT系列为代表的语言模型风暴,重新定义了人类与机器的交互方式。 一、传统NLP的瓶颈:…...

机器翻译模型笔记

机器翻译学习笔记&#xff08;简体中文&#xff09; 1. 任务概述 目标&#xff1a;将英文句子翻译成简体中文。 示例&#xff1a; 输入&#xff1a;Tom is a student. 输出&#xff1a;汤姆是一个学生。 框架&#xff1a;Seq2Seq&#xff08;序列到序列&#xff09;模型。…...

Ref vs. Reactive:Vue 3 响应式变量的最佳选择指南

Ref vs. Reactive&#xff1a;Vue 3 响应式变量的最佳选择指南 在 Vue 3 的 Composition API 中&#xff0c;ref 和 reactive 是创建响应式数据的两种主要方式。许多开发者经常困惑于何时使用哪种方式。本文将深入对比两者的差异&#xff0c;帮助您做出最佳选择。 核心概念解…...

让视觉基础模型(VFMs)像大语言模型(LLMs)一样“会思考”​

视觉检测器的演进&#xff1a;从 DETR 到 Grounding-DINO DINO-R1 的基础是 Grounding-DINO&#xff0c;而 Grounding-DINO 本身是一系列视觉检测器演进的结果。理解这个发展过程对掌握 DINO-R1 的核心技术至关重要。 DETR&#xff1a;用 Transformer 革新目标检测 在 DETR&…...

现代前端框架的发展与演进

现代前端框架的发展与演进是一个非常值得关注的话题&#xff0c;反映了整个前端生态系统的不断演化与技术深度的提升。以下是这一趋势的详细解析&#xff1a; &#x1f4c8; 现代前端框架的发展与演进 &#x1f539; 第一阶段&#xff1a;jQuery 时代&#xff08;2006-2013&am…...

【LLM-Agent】智能体的记忆缓存设计

note 实践&#xff1a;https://modelscope-agent.readthedocs.io/zh-cn/latest/modules/memory.html 文章目录 note一、Agent的记忆实现二、相关综述三、记忆体的构建四、cursor的记忆设计1. 记忆生成提示词2. 记忆评估提示词 五、记忆相关的MCPReference 一、Agent的记忆实现…...

一起学Spring AI:核心概念

人工智能概念 本节描述了 Spring AI 使用的核心概念。我们建议您仔细阅读&#xff0c;以理解 Spring AI 实现背后的思想。 模型&#xff08;Models&#xff09; 人工智能模型是设计用来处理和生成信息的算法&#xff0c;通常模仿人类的认知功能。通过从大型数据集中学习模式…...

Oracle业务用户的存储过程个数及行数统计

Oracle业务用户的存储过程个数及行数统计 统计所有业务用户存储过程的个数独立定义的存储过程定义在包里的存储过程统计所有业务用户存储过程的总行数独立定义的存储过程定义在包里的存储过程📖 对存储过程进行统计主要用到以下三个系统视图: dba_objects:记录了所有独立创…...

PicSharp(图片压缩工具) v1.1.6

PicSharp 一个简单、高效、灵活的跨平台桌面图像压缩应用程序。软件基于Rust实现&#xff0c;高性能低资源&#xff0c;能快速扫描文件或目录&#xff0c;批处理图像。软件还具备组合压缩策略&#xff0c;TinyPNG提供最佳压缩比&#xff0c;但需要互联网连接&#xff0c;对大量…...

前端文件下载常用方式详解

在前端开发中&#xff0c;实现文件下载是常见的需求。根据不同的场景&#xff0c;我们可以选择不同的方法来实现文件流的下载。本文介绍三种常用的文件下载方式&#xff1a; 使用 axios 发送 JSON 请求下载文件流使用 axios 发送 FormData 请求下载文件流使用原生 form 表单提…...

【DAY42】Grad-CAM与Hook函数

内容来自浙大疏锦行python打卡训练营 浙大疏锦行 知识点: 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 作业&#xff1a;理解下今天的代码即可 在深度学习中&#xff0c;我们经常需要查看或修改模型中间层的输出或梯度。然而&#xff0c;标准的前向传播和反…...

如何生成和制作PDF文件

在数字化办公的今天&#xff0c;PDF文件已经成为我们工作和学习中不可或缺的一部分。无论是合同、报告、简历&#xff0c;还是电子书、表单&#xff0c;PDF格式都以其跨平台兼容性、不可编辑性和清晰的排版而被广泛使用。但你是否知道&#xff0c;生成和制作PDF文件其实并不复杂…...

【K8S系列】Kubernetes 中 Pod(Java服务)启动缓慢的深度分析与解决方案

本文针对 Kubernetes 中 Java 服务启动时间慢的深度分析与解决方案文章,结合了底层原理、常见原因及具体优化策略: Kubernetes 中 Java 服务启动缓慢的深度分析与高效解决方案 在 Kubernetes 上部署 Java 应用时,启动时间过长是常见痛点,尤其在需要快速扩缩容或滚动更新的…...

【Java学习笔记】StringBuilder类(重点)

StringBuilder&#xff08;重点&#xff09; 1. 基本介绍 是一个可变的字符串序列。该类提供一个与 StringBuffer 兼容的 API&#xff0c;但不保证同步&#xff08;StringBuilder 不是线程安全的&#xff09; 该类被设计用作 StringBuffer 的一个简易替换&#xff0c;用在字符…...

JavaScript ES6 解构:优雅提取数据的艺术

JavaScript ES6 解构&#xff1a;优雅提取数据的艺术 在 JavaScript 的世界中&#xff0c;ES6&#xff08;ECMAScript 2015&#xff09;的推出为开发者带来了许多革命性的特性&#xff0c;其中“解构赋值”&#xff08;Destructuring Assignment&#xff09;无疑是最受欢迎的功…...

iview Switch Tabs TabPane 使用提示Maximum call stack size exceeded堆栈溢出

在vue项目中使用iview 框架部分组件时&#xff0c;直接引入使用报Maximum call stack size exceeded image.png 堆栈溢出 解决方案 更换组件名称就可以了 image.png 或 image.png 就可以了 猜测是因为和vue自己提供的组件名称一致了&#xff0c;重名问题导致的&#xff0c;具体…...

基于Halcon深度学习之分类

***** ***环境准备*** ***系统&#xff1a;win7以上系统 ***显卡&#xff1a;算力3.0以上 ***显卡驱动&#xff1a;10.1以上版本&#xff08;nvidia-smi查看指令&#xff09;***读取深度学习模型*** read_dl_model (pretrained_dl_classifier_compact.hdl, DLModelHandle) ***获…...

零基础在实践中学习网络安全-皮卡丘靶场(第十五期-URL重定向模块)

本期内容和之前的CSRF&#xff0c;File inclusion有联系&#xff0c;复习后可以更好了解 介绍 不安全的url跳转 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目…...

技巧小结:根据寄存器手册写常用外设的驱动程序

需求&#xff1a;根据STM32F103寄存器手册写DMA模块的驱动程序 一、分析标准库函数的写法&#xff1a; 各个外设的寄存器地址定义在stm32f10x.h文件中&#xff1a;此文件由芯片厂家提供;内核的有关定义则定义在core_cm3.h文件中&#xff1a;ARM提供; 1、查看外设区域多级划分…...

设计模式(代理设计模式)

代理模式解释清楚&#xff0c;所以如果想对一个类进行功能上增强而又不改变原来的代码情况下&#xff0c;那么只需要让这个类代理类就是我们的顺丰&#xff0c;对吧?并行增强就可以了。具体增强什么?在哪方面增强由代理类进行决定。 代码实现就是使用代理对象代理相关的逻辑…...

从代码学习深度强化学习 - 初探强化学习 PyTorch版

文章目录 前言强化学习的概念强化学习的环境强化学习中的数据强化学习的独特性总结前言 本文将带你初步了解强化学习 (Reinforcement Learning, RL) 的基本概念,并通过 PyTorch 实现一些简单的强化学习算法。强化学习是一种让智能体 (agent) 通过与环境 (environment) 的交互…...

AI大神吴恩达-提示词课程笔记

如何有效编写提示词 在学习如何与语言模型&#xff08;如ChatGPT&#xff09;交互时&#xff0c;编写清晰且高效的提示词&#xff08;Prompt&#xff09;是至关重要的。本课程由ESA提供&#xff0c;重点介绍了提示词工程&#xff08;Prompt Engineering&#xff09;的两个核心…...