tencent cloud

云点播

动态与公告
产品动态
公告
产品简介
产品概述
产品特性
产品功能
产品优势
应用场景
解决方案
专业版
云点播专业版简介
快速入门
控制台指南
开发指南
购买指南
计费概述
计费方式
购买指引
账单查询
续费说明
欠费说明
退费说明
快速入门
控制台指南
控制台介绍
服务概览
应用管理
媒体管理
资源包管理
License 管理
实时日志分析
实践教程
媒体上传
如何将点播的媒体文件进行智能降冷
媒体处理
分发播放
如何接收事件通知
如何进行源站迁移
直播录制
如何进行自定义源站回源
直播精彩剪辑固化至云点播 VOD 指引
如何使用 EdgeOne 分发云点播内容
开发指南
媒体上传
媒体加工处理
媒体 AI
事件通知
媒体分发播放
媒体加密与版权保护
播放频道
访问管理
下载媒体文件
应用体系
错误码
播放器 SDK 文档
概述
基本概念
产品功能
Demo 体验
免费测试
购买指南
SDK 下载
License 指引
播放器教程
含 UI 集成方案
无 UI 集成方案
高级功能
API 文档
第三方播放器插件
Player SDK Policy
服务端 API 文档
History
Introduction
API Category
Other APIs
Media Processing APIs
Task Management APIs
Media Upload APIs
Media Management APIs
Event Notification Relevant API
Media Categorization APIs
Domain Name Management APIs
Distribution APIs
AI-based Sample Management APIs
Region Management APIs
Data Statistics APIs
Carousel-Related APIs
Just In Time Transcode APIs
No longer recommended APIs
Making API Requests
AI-based image processing APIs
Parameter Template APIs
Task Flow APIs
Data Types
Error Codes
Video on Demand API 2024-07-18
常见问题
移动端播放问题
费用相关问题
视频上传问题
视频发布问题
视频播放问题
Web 端播放问题
全屏播放问题
数据统计问题
访问管理相关问题
媒资降冷问题
相关协议
Service Level Agreement
VOD 政策
隐私政策
数据处理和安全协议
联系我们
词汇表

第三方播放器 Web 插件

PDF
聚焦模式
字号
最后更新时间: 2022-10-17 11:42:21
本文档是介绍第三方播放器 Web 插件,它可以帮助腾讯云客户通过灵活的接口,快速实现第三方播放器与云点播能力的结合,实现视频播放功能。本插件支持获取视频基本信息、视频流信息、关键帧与缩略图信息等,支持私有加密,本文档适合有一定 Javascript 语言基础的开发人员阅读。

SDK 集成

第三方播放器 Web 插件提供 CDN 集成npm 集成两种集成方式:

CDN 集成

在需要播放视频的页面中引入初始化脚本,脚本会在全局下暴露 TcAdapter 变量。
<script src="https://cloudcache.tencentcs.com/qcloud/video/dist/tcadapter.1.0.0.min.js"></script>

npm 集成

// npm install
npm install tcadapter --save

// import TcAdapter
import TcAdapter from 'tcadapter';

放置播放器容器

在需要展示播放器的页面加入容器,TcAdapter 仅需要承载播放视频的容器,播放样式和自定义功能可由第三方播放器或使用者自行实现:
<video id="player-container-id">
</video>

SDK 使用说明

检测开发环境

检测当前环境是否支持 TcAdapter。
TcAdapter.isSupported();

初始化 Adapter

初始化 Adapter,创建 Adapter 实例。初始化过程会请求腾讯云点播服务器,获取视频文件信息。
接口
const adapter = new TcAdapter('player-container-id', {
fileID: string,
appID: string,
psign: string,
hlsConfig: {}
}, callback);
参数说明
参数名
类型
描述
appID
String
点播账号的 APPID
fileID
String
要播放的视频 fileId
psign
String
播放器签名
hlsConfig
HlsConfig
HLS 相关设置,可使用 hls.js 支持的任意参数
callback
TcAdapterCallBack
初始化完成回调,可以在此方法之后获取视频基本信息
注意:
TcAdapter 底层基于 hls.js 实现,可以通过 HlsConfig 接收 hls.js 支持的任意参数,用于对播放行为的精细调整。

获取视频基本信息

获取视频的信息, 必须是在初始化之后才生效。
接口
VideoBasicInfo adapter.getVideoBasicInfo();
参数说明
VideoBasicInfo 参数如下:
参数名
类型
描述
name
String
视频名称
duration
Float
视频时长,单位:秒
description
String
视频描述
coverUrl
String
视频封面

获取视频流信息

接口
List<StreamingOutput> adapter.getStreamimgOutputList();
参数说明
StreamingOutput 参数如下:
参数名
类型
描述
drmType
String
自适应码流保护类型,目前取值有 plain 和 simpleAES。plain 表示不加密,simpleAES 表示 HLS 普通加密
playUrl
String
播放 URL
subStreams
List
自适应码流子流信息,类型为 SubStreamInfo
SubStreamInfo 参数如下:
参数名
类型
描述
type
String
子流的类型,目前可能的取值仅有 video
width
Int
子流视频的宽,单位:px
height
Int
子流视频的高,单位:px
resolutionName
String
子流视频在播放器中展示的规格名

获取关键帧打点信息

接口
List<KeyFrameDescInfo> adapter.getKeyFrameDescInfo();
参数说明
KeyFrameDescInfo 参数如下:
参数名
类型
描述
timeOffset
Float
1.1
content
String
"片头开始..."

获取缩略图信息

接口
ImageSpriteInfo adapter.getImageSpriteInfo();
参数说明
ImageSpriteInfo 参数如下:
参数名
类型
描述
imageUrls
List
缩略图下载 URL 数组,类型为 String
webVttUrl
String
缩略图 VTT 文件下载 URL

监听事件

播放器可以通过初始化返回的对象进行事件监听,示例:
const adapter = TcAdapter('player-container-id', options);
adapter.on(TcAdapter.TcAdapterEvents.Error, function(error) {
// do something
});
其中 type 为事件类型,支持的事件包括 HLS 原生的事件以及以下事件,可从 TcAdapter.TcAdapterEvents 中访问到事件名称:
名称
介绍
LOADEDMETADATA
通过 playcgi 获取到了相应的视频信息,在此事件回调中可以获取视频相关信息
HLSREADY
hls实例创建完成,可以在此时机调用 hls 实例对象上的各种属性和方法
ERROR
出现错误时触发,可从回调参数中查看失败具体原因

获取 Hls 实例

adapter 底层基于 hls.js 实现,可以通过 adapter 实例访问到 HLS 实例以及实例上的属性和方法,用于实现对播放流程的精细控制。
adapter.on('hlsready', () => {
const hls = adapter.hls;
// ...
})
说明:
具体请参见 hls.js

示例

例1:在 React 中使用 TcAdapter

具体示例,请参见 GitHub
import { useEffect, useRef } from 'react';
import TcAdapter from 'tcadapter';

function App() {
if (!TcAdapter.isSupported()) {
throw new Error('current environment can not support TcAdapter');
}

const videoRef = useRef(null);
useEffect(() => {
const adapter = new TcAdapter(videoRef.current, {
appID: '1500002611',
fileID: '5285890813738446783',
psign: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6MTUwMDAwMjYxMSwiZmlsZUlkIjoiNTI4NTg5MDgxMzczODQ0Njc4MyIsImN1cnJlbnRUaW1lU3RhbXAiOjE2MTU5NTEyMzksImV4cGlyZVRpbWVTdGFtcCI6MjIxNTY1MzYyMywicGNmZyI6ImJhc2ljRHJtUHJlc2V0IiwidXJsQWNjZXNzSW5mbyI6eyJ0IjoiMjIxNTY1MzYyMyJ9fQ.hRrQYvC0UYtcO-ozB35k7LZI6E3ruvow7DC0XzzdYKE',
hlsConfig: {},
}, () => {
console.log('basicInfo', adapter.getVideoBasicInfo());
});

adapter.on(TcAdapter.TcAdapterEvents.HLSREADY, () => {
const hls = adapter.hls;
// ...
})
}, []);


const play = () => {
videoRef.current.play();
}

return (
<div>
<div>
<video id="player" ref={ videoRef }></video>
</div>
<button onClick={play}>play</button>
</div>
);
}

export default App;


例2:TcAdapter 与 videojs 结合

具体示例,请参见 GitHub
// 1. videojs 播放 hls 会使用 @videojs/http-streaming,所以我们开发一套使用 tcadapter 播放的策略覆盖原有逻辑(也可以直接修改 @videojs/http-streaming 内部逻辑)

// src/js/index.js
import videojs from './video';
import '@videojs/http-streaming';
import './tech/tcadapter'; // 新增逻辑
export default videojs;


// src/js/tech/tcadapter.js
import videojs from '../video.js';
import TcAdapter from 'tcadapter';

class Adapter {
constructor(source, tech, options) {
const el = tech.el();
// 获取参数并初始化实例
const adapter = new TcAdapter(el, {
appID: '1500002611',
fileID: '5285890813738446783',
psign: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6MTUwMDAwMjYxMSwiZmlsZUlkIjoiNTI4NTg5MDgxMzczODQ0Njc4MyIsImN1cnJlbnRUaW1lU3RhbXAiOjE2MTU5NTEyMzksImV4cGlyZVRpbWVTdGFtcCI6MjIxNTY1MzYyMywicGNmZyI6ImJhc2ljRHJtUHJlc2V0IiwidXJsQWNjZXNzSW5mbyI6eyJ0IjoiMjIxNTY1MzYyMyJ9fQ.hRrQYvC0UYtcO-ozB35k7LZI6E3ruvow7DC0XzzdYKE',
hlsConfig: {},
});
adapter.on(TcAdapter.TcAdapterEvents.LEVEL_LOADED, this.onLevelLoaded.bind(this));
}

dispose() {
this.hls.destroy();
}

onLevelLoaded(event) {
this._duration = event.data.details.live ? Infinity : event.data.details.totalduration;
}

}

let hlsTypeRE = /^application\\/(x-mpegURL|vnd\\.apple\\.mpegURL)$/i;
let hlsExtRE = /\\.m3u8/i;

let HlsSourceHandler = {
name: 'hlsSourceHandler',
canHandleSource: function (source) {
// skip hls fairplay, need to use Safari resolve it.
if (source.skipHlsJs || (source.keySystems && source.keySystems['com.apple.fps.1_0'])) {
return '';
} else if (hlsTypeRE.test(source.type)) {
return 'probably';
} else if (hlsExtRE.test(source.src)) {
return 'maybe';
} else {
return '';
}
},

handleSource: function (source, tech, options) {
if (tech.hlsProvider) {
tech.hlsProvider.dispose();
tech.hlsProvider = null;
} else {
// hls关闭自动加载后,需要手动加载资源
if (options.hlsConfig && options.hlsConfig.autoStartLoad === false) {
tech.on('play', function () {
if (!this.player().hasStarted()) {
this.hlsProvider.hls.startLoad();
}
});
}
}
tech.hlsProvider = new Adapter(source, tech, options);
return tech.hlsProvider;
},
canPlayType: function (type) {
if (hlsTypeRE.test(type)) {
return 'probably';
}
return '';
}
};

function mountHlsProvider(enforce) {
if (TcAdapter && TcAdapter.isSupported() || !!enforce) {
try {
let html5Tech = videojs.getTech && videojs.getTech('Html5');
if (html5Tech) {
html5Tech.registerSourceHandler(HlsSourceHandler, 0);
}
} catch (e) {
console.error('hls.js init failed');
}
} else {
//没有引入tcadapter 或者 MSE 不可用或者x5内核禁用
}
}
mountHlsProvider();
export default Adapter;



帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈