OrangeCloud Player SDK 是一个多平台视频播放器 SDK,提供短剧/短视频场景下的极致播放体验。核心能力包括预播放、预下载、播放器复用等秒开优化技术。
| 平台 | 包名 | 语言 | 播放引擎 |
|---|---|---|---|
| Flutter | orangecloud_player_client | Dart | Platform Channel → 原生 |
| iOS | OrangeCloudPlayerClient | Swift | AVPlayer |
| Android | orangecloud-player-client | Kotlin | ExoPlayer |
| Web | @orangecloud/player-client | TypeScript | HTML5 Video + MSE |
在 OMS 后台 → 基础SDK → 播放器管理 中创建应用,获取:
PlayerAppId — 应用标识SecretKey — 密钥(用于 License 校验签名)LicenseUrl — License 校验服务地址// Flutter
await OrangeCloudPlayerClient.initialize(
appId: 'your_player_app_id',
licenseUrl: 'https://sdk-api.your-domain.com/License/Validate',
secretKey: 'your_secret_key',
);
final player = OrangeCloudPlayerClient();
await player.startVodPlay('https://example.com/video.mp4');
# pubspec.yaml
dependencies:
orangecloud_player_client: ^1.0.0
import 'package:orangecloud_player_client/orangecloud_player_client.dart';
// 在 main() 或 App 启动时调用(只需一次)
await OrangeCloudPlayerClient.initialize(
appId: 'your_player_app_id',
licenseUrl: 'https://sdk-api.your-domain.com/License/Validate',
secretKey: 'your_secret_key', // 可选,提供后启用 License 校验
);
注意:initialize 必须在使用任何播放功能之前调用。
// 创建播放器
final player = OrangeCloudPlayerClient();
// 播放
await player.startVodPlay('https://example.com/video.mp4');
// 暂停 / 恢复
await player.pause();
await player.resume();
// Seek(秒)
await player.seek(30.0);
// 倍速
await player.setRate(1.5);
// 音量(0.0 - 1.0)
await player.setAudioPlayoutVolume(0.8);
// 静音
await player.setMute(true);
// 循环播放
await player.setLoop(true);
// 截图
final imageData = await player.snapshot();
// 切换清晰度
await player.setBitrateIndex(2);
// 停止
await player.stopPlay();
// 释放资源
await player.dispose();
// 在 Widget 中使用
Widget build(BuildContext context) {
return AspectRatio(
aspectRatio: 16 / 9,
child: player.videoWidget,
);
}
class MyObserver extends PlayerObserver {
@override
void onPlayEvent(PlayerEvent event, Map<String, dynamic> params) {
switch (event) {
case PlayerEvent.onPlayBegin:
print('播放开始');
break;
case PlayerEvent.onPlayProgress:
print('进度: ${params["currentTime"]}s / ${params["duration"]}s');
break;
case PlayerEvent.onPlayEnd:
print('播放结束');
break;
case PlayerEvent.onError:
print('错误: ${params["code"]} - ${params["message"]}');
break;
default:
break;
}
}
@override
void onNetStatus(Map<String, dynamic> netStatus) {
print('网速: ${netStatus["speedKBps"]} KB/s');
}
}
// 注册监听
player.addObserver(MyObserver());
// 移除监听
player.removeObserver(observer);
// Package.swift
dependencies: [
.package(path: "../OrangeCloudPlayerClient"),
]
import OrangeCloudPlayerClient
// AppDelegate 中初始化
OCPlayerClient.initialize(appId: "your_app_id", licenseUrl: "https://...")
let player = OCPlayerClient()
player.delegate = self
// 添加播放器视图
view.addSubview(player.playerView)
// 播放
player.startVodPlay("https://example.com/video.mp4")
// 暂停 / 恢复
player.pause()
player.resume()
// Seek(秒)
player.seek(30.0)
// 倍速
player.setRate(1.5)
// 截图
let image = player.snapshot()
// settings.gradle.kts
include(":orangecloud-player-client")
// app/build.gradle.kts
dependencies {
implementation(project(":orangecloud-player-client"))
}
// Application.onCreate() 中
OrangeCloudPlayerClient.initialize(this, "your_app_id", "https://...")
val player = OrangeCloudPlayerClient(context)
player.setPlayerListener(listener)
player.setSurface(surfaceView.holder.surface)
// 播放
player.startVodPlay("https://example.com/video.mp4")
// 暂停 / 恢复
player.pause()
player.resume()
// Seek(秒)
player.seek(30.0f)
// 倍速
player.setRate(1.5f)
// 音量(0.0 - 1.0)
player.setAudioPlayoutVolume(0.8f)
// 释放
player.release()
npm install @orangecloud/player-client
import { OrangeCloudPlayerClient } from '@orangecloud/player-client';
OrangeCloudPlayerClient.initialize({
appId: 'your_app_id',
licenseUrl: 'https://...',
});
const container = document.getElementById('player');
const player = new OrangeCloudPlayerClient(container);
// 播放
await player.startVodPlay('https://example.com/video.mp4');
// 暂停 / 恢复
player.pause();
player.resume();
// 事件监听
player.on(PlayerEvent.OnPlayProgress, (data) => {
console.log(`进度: ${data.currentTime}s`);
});
// 释放
player.dispose();
提前创建播放器实例加载到首帧就绪,实现秒切。
// Flutter
final prePlayer = PrePlayerManager(maxConcurrent: 3);
await prePlayer.preload('https://example.com/next-video.mp4');
// 切换时秒开
final readyPlayer = prePlayer.getPreloadedPlayer(url);
后台下载视频前 N MB 数据,不创建播放器实例。
// Flutter
final preloadManager = PreloadManager();
await preloadManager.startPreload(
url: 'https://example.com/video.mp4',
preloadSizeMB: 2.0,
preferredResolution: 1080,
);
// Flutter
final dm = DownloadManager();
final taskId = await dm.startDownload(url: 'https://example.com/video.mp4');
// 监听进度
dm.onProgress.listen((event) {
print('下载进度: ${(event.progress * 100).toStringAsFixed(1)}%');
});
// 暂停 / 恢复(断点续传)
await dm.pauseDownload(taskId);
await dm.resumeDownload(taskId);
// 离线播放
final localPath = dm.playOffline(taskId);
if (localPath != null) {
await player.startVodPlay(localPath);
}
final drm = DRMManager();
drm.configureHLSDecryption(keyUrl: 'https://key-server.com/key');
drm.configureDRM(
licenseUrl: 'https://license.example.com/drm',
headers: {'Authorization': 'Bearer token'},
);
// Flutter
final pip = PIPController();
await pip.enterPictureInPictureMode();
// 监听事件
pip.onPIPEvent.listen((event) {
if (event == PIPEvent.exit) print('退出画中画');
});
// Flutter
final subtitle = SubtitleEngine();
subtitle.loadSubtitleFromContent(srtContent, SubtitleFormat.srt);
// 监听字幕文本
subtitle.onSubtitleData.listen((data) {
print('字幕: ${data.text}');
});
| 方法 | 说明 | 参数 |
|---|---|---|
startVodPlay(url) | 通过 URL 播放 | url: String |
stopPlay() | 停止播放 | - |
pause() | 暂停 | - |
resume() | 恢复播放 | - |
seek(time) | 跳转到指定时间 | time: 秒 |
setRate(rate) | 设置倍速 | rate: 0.5-3.0 |
setAudioPlayoutVolume(vol) | 设置音量 | vol: 0.0-1.0 |
setMute(mute) | 静音 | mute: bool |
setLoop(loop) | 循环播放 | loop: bool |
setAutoPlay(auto) | 自动播放 | auto: bool |
setRenderMode(mode) | 渲染模式 | 0=铺满, 1=适应 |
setBitrateIndex(idx) | 切换清晰度 | idx: int |
enableHardwareDecode(en) | 硬解开关 | en: bool |
snapshot() | 截图 | - |
setStartTime(time) | 起播时间 | time: 秒 |
dispose() | 释放资源 | - |
| 范围 | 类别 | 说明 |
|---|---|---|
| 1000-1099 | 网络错误 | 连接失败、超时、DNS 错误 |
| 2000-2099 | 解码错误 | 解码器初始化失败、格式不支持 |
| 3000-3099 | DRM 错误 | License 获取失败、密钥过期 |
| 4000-4099 | 缓存错误 | 写入失败、存储空间不足 |
| 5000-5099 | 下载错误 | 下载失败、取消 |
| 6000-6099 | 配置错误 | License 无效、AppId 错误 |
| 7000-7099 | 套餐错误 | 套餐过期、配额超限 |
| 8000-8099 | 平台错误 | 原生引擎崩溃、未知错误 |
OrangeCloud Player SDK v1.0.0 各平台仓库:
| 平台 | 格式 | GitHub |
|---|---|---|
| Flutter | Dart Package (Git) | OrangeCloud-SDK-Player/orangecloud-player-flutter |
| iOS | Swift Package (SPM) | OrangeCloud-SDK-Player/orangecloud-player-ios |
| Android | AAR | OrangeCloud-SDK-Player/orangecloud-player-android |
| Web | TypeScript (npm) | OrangeCloud-SDK-Player/orangecloud-player-web |
各平台完整 Demo 源码,演示播放器 SDK 所有功能:
| 平台 | 说明 | GitHub |
|---|---|---|
| Flutter | 基础播放 / 短视频 / 离线下载 / 画中画 | Flutter Demo |
| Android | Activity 集成 / 播放控制 / 事件监听 | Android Demo |
| iOS | SwiftUI 播放器 / 进度控制 / 截图 | iOS Demo |
| Web | HLS/DASH 播放 / 控制栏 / 事件日志 | Web Demo |