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

发布于:2025-06-08 ⋅ 阅读:(22) ⋅ 点赞:(0)

一、技术背景

自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)

<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 true
        reset()
        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为等比)
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. 创建播放器并初始化配置

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 {
	@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. 停止与释放资源

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


网站公告

今日签到

点亮在社区的每一天
去签到