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.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 播放模块具备超低延迟、高稳定性、强兼容性与良好扩展性,适用于安防监控、远程教育、互动直播、工业图传等多个领域。

相关推荐
沃虎Chinty-0312 小时前
音频变压器选型与应用:三大核心功能深度解析
音视频
李艺为13 小时前
Fake Device Test作假屏幕分辨率分析
android·java
zh_xuan13 小时前
github远程library仓库升级
android·github
互联科技报13 小时前
2026年第一季度短视频矩阵视频混剪头部工具市场动态深度解析
人工智能·矩阵·音视频
Digitally13 小时前
如何将 iPad 上的视频无损传输到 Mac
macos·音视频·ipad
峥嵘life13 小时前
Android蓝牙停用绝对音量原理
android
czlczl2002092515 小时前
IN和BETWEEN在索引效能的区别
android·adb
Volunteer Technology15 小时前
ES高级搜索功能
android·大数据·elasticsearch
AI25122415 小时前
AI视频生成技术解析:主流软件原理与选型指南
人工智能·音视频
ting945200015 小时前
微软 VibeVoice 万字深度解析:从原理、架构、部署到行业落地,重新定义长音频 AI
人工智能·架构·音视频