一、技术背景
自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.java
| JNI 接口桥接类,建议放入 com.daniulive.smartplayer
包下 |
| SmartPlayer.java
| 上层封装类,用于统一操作 |
| libSmartPlayer.so
| C++ 播放内核,放入对应架构 jniLibs
下 |
2. 权限配置(AndroidManifest.xml)
java
<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 库
java
static {
System.loadLibrary("SmartPlayer");
}
4. Gradle ABI 配置
java
splits {
abi {
enable true
reset()
include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
universalApk true
}
}
5. app_name 配置(授权验证)
java
<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为等比) |
| SmartPlayerSetSurfaceRenderFormat
| SurfaceView 渲染格式 |
| 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. 创建播放器并初始化配置
java
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. 设置播放事件监听
java
class EventHandeV2 implements NTSmartEventCallbackV2 {
@Override
public 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 + ", 截取快照成功";
else
player_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. 停止与释放资源
java
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 播放模块具备超低延迟、高稳定性、强兼容性与良好扩展性,适用于安防监控、远程教育、互动直播、工业图传等多个领域。