PC C++ SDK 全局函数、防录制功能、下载器、播放器

news2024/12/23 1:13:41

本文档提供了使用 C++SDK 的操作步骤及代码示例,通过本文您可以快速了解如何使用 SDK 提供的功能。您也可以通过 Demo 中的示例进行了解和自有业务开发。

 

SDK 名词含义及功能说明

参见 plv-player-def.h

SDK 全局函数

  1. 设置日志,日志过滤项。
  2. 设置观众信息(用于后台数据追踪)。
  3. 设置相关参数(硬解开关,网络请求类型等)。
  4. 初始化(userid, key, readtokan)。
  5. 退出析构。
std::count << "the sdk version:" << PLVGetSdkVersion() << std::endl;
// 路径须使用utf8
std::string logFile = "C:\log\sdk.log"
int ret = PLVSetSdkLogFile(logFile.c_str());
std::count << "the log file result:" << ret << std::endl;
// 设置先 https 请求网络数据
PLVSetSdkHttpRequest(ONLY_HTTPS_REQUEST);
// 设置结束播放之后保留最后的画面
PLVSetSdkKeepLastFrame(true);

// 设置 viewer 信息,用于定位播放质量问题,在线播放下可以通过后台来查看,建议调用此接口设置信息
// 最新 vrm12 下必须设置,否则播放会报错
std::string viewerId = "业务id";// 唯一值
std::string viewerName = "业务nick";
std::string viewerAvatar= "业务Avatar";
PLVSetSdkViewerInfo(viewerId.c_str(), viewerName.c_str(), viewerAvatar.c_str());

// 请填入你的项目 User ID
std::string userID  = "xxxxxxxx";
// 请填入你的项目 Secret Key
std::string  secretKey = "xxxxxxxxxxxxxxxxxxxxxx";
// 请填入你的项目 Read Token
std::string readToken= "xxxxxxxxxxxxxxxxxxx";

ret = PLVInitSdkLibrary(userID.c_str(), secretKey.c_str(), readToken.c_str());
std::cout << "init sdk result:" << ret << std::endl;
// 获取错误描述
auto desc = PLVGetSdkErrorDescription(ret);
std::cout<< "the error info: << desc << std::endl;

// 退出使用
PLVReleaseSdkLibrary();

SDK 防录制功能

防录制功能的说明,必须 SDK 初始化之后才能使用,操作步骤及功能示例如下:

// 注意通知回调都是子线程,如果更新 ui 及操作 api 都需要 post 到主线程
class Record{
public:
    Record(void){
        // 软件破解注入通知
        PLVSetPluginInjectHandler(true, []{
            // 有插件注入通知,可能有软件在录制你的播放界面,可以在业务上做处理
            // PostMessage
        }, userdata);
        
        // HDMI 变动通知
        PLVSetHDMIDeviceChangedHandler(true, [](HDMI_DEVICE_TYPE type, const char* device, void* data){
            // HDMI 设备有变动,请根据 type 类型判断,可能是 HDMI 设备在录制你的屏幕
            // PostMessage
        }, userdata);
    }
    // 软件防录制
    int SetPreventRecord(void* window, bool enable){
        PLVGetPreventRecord(window, enable);
    }
};

SDK 下载器

视频下载的操作步骤及功能示例如下:

// 注意通知回调都是子线程,如果更新 ui 及操作 api 都需要 post 到主线程
class Download{
private:
    PLVDownloadPtr downolader = nullptr;
public:
    Download(void){
        // 创建下载器
        downolader = PLVDownloadCreate();
        
        // 设置错误回调通知
        PLVDownloadSetErrorHandler(downolader, [](const char* vid, int code, void* data) {
            // 错误通知 code 为错误码
            // PostMessage
        }, userdata);
        // 设置下载进度回调通知
        PLVDownloadSetProgressHandler(downolader, [](const char* vid, long long receivedBytes, long long totalBytes, void* data) {
            // 下载进度
            // PostMessage
        }, userdata);
        // 设置下载结果回调通知
        PLVDownloadSetResultHandler(downolader, [](const char* vid, int rate, int code, void* data) {
            // 下载结果
            // PostMessage
        }, userdata);
    }
    ~Download(void){
        PLVDownloadDestroy(downolader);
        downolader = nullptr;
    }
    // 设置下载信息,操作前必须先调用此接口
    int SetVideo(const char* vid, const char* path, int rate){
        return PLVDownloadSetVideo(downolader, vid, path, rate);
    }
    // 开始下载
    // autoDownRate 是否自动降清晰度,false 如果没有这个清晰度则返回错误码
    int Start(bool autoDownRate){
        return PLVDownloadStart(downolader, autoDownRate);
    }
    // 结束下载,退出线程
    int Stop(void){
        return PLVDownloadStop(downolader);
    }
    // 暂停下载,不退出线程,可以快速切换下载状态
    int Pause(void){
        return PLVDownloadPause(downolader);
    }
    // 删除下载文件
    int Delete(void){
        return PLVDownloadDelete(downolader);
    }  
};

SDK 播放器

视频播放的操作步骤及功能示例如下:

// 注意通知回调都是子线程,如果更新 ui 及操作 api 都需要 post 到主线程
class Player{
private:
    PLVPlayer mediaPlayer = nullptr;
public:
    Player((void*)window){
        // 创建播放器
        mediaPlayer = PLVPlayerCreate(window);
        
        // 设置播放器的播放状态通知
        PLVPlayerSetStateHandler(mediaPlayer, [](const char* vid, int state, void* data) {
            // 播放器的状态,state 参见 PLAYER_MEDIA_STATE
            // PostMessage();
        }, userdata);
        // 设置视频的属性回调通知
        PLVPlayerSetPropertyHandler(mediaPlayer, [](const char* vid, int property, int format, const char* value, void* data) {
            // 播放器的属性值
            // PostMessage();
        }, userdata);
        // 设置码率清晰度变化通知 (只有输入的码率不存在,自动降值才会触发此通知)
        PLVPlayerSetRateChangeHandler(mediaPlayer, [](const char* vid, int inputBitRate, int realBitRate, void* data) {
            // 真实的清晰度,比如目标清晰度为超清,但不存在此清晰度,会自动降值为 realBitRate
            // PostMessage();
        }, userdata);
        // 设置播放器播放进度回调通知
        PLVPlayerSetProgressHandler(mediaPlayer, [](const char* vid, int millisecond, void* data) {
            // 播放位置
            // PostMessage();
        }, userdata);
        // 设置扬声器设备有热插拔的变动通知
        PLVPlayerSetAudioDeviceHandler(mediaPlayer, [](const char* vid, int audioDeviceCount, void* data) {
            // 扬声器设备变动,此为设备热插拔变动通知,可以 post 到主线程再调用 ReloadAudio();
            // PostMessage();
        }, userdata);
    }
    ~Player(void){
        PLVPlayerDestroy(mediaPlayer);
        mediaPlayer = nullptr;
    }
    
    // 设置跑马灯
    int SetOSD(bool enable, const OSDConfigInfo* config){
        return PLVPlayerSetOSDConfig(mediaPlayer, enable, config);
    }
    int GetOSD(OSDConfigInfo& config){
        return PLVPlayerGetOSDConfig(config);
    }
    // 设置 LOGO text
    int SetLogo(bool enable, const LogoTextInfo* config);
    int GetLogo(LogoTextInfo& config);
    // 设置缓存,可以不设置,播放器会有默认值
    int SetCache(bool enable, int maxCacheBytes, int maxCacheSeconds);
    int GetCache(int* maxCacheBytes, int* maxCacheSeconds);
    // 播放前要先设置 vid
    int SetVideo(const char* vid, const char* path, int rate);
    // 播放,token 外部获取,seekMillisecond 为要跳转到播放位置,sync 由于会先请求 vid 的信息,会有 http 请求,如果网络好请使用 true 同步,否则可以用 false
    int Play(const char* token, int seekMillisecond, bool sync);
    // 本地播放
    int PlayLocal(int seekMillisecond);
    // 本地加载,不播放
    int LoadLocal(int seekMillisecond);
    int Pause(bool pause);
    int Stop(void);
    int SetMute(bool mute);
    // 跳转,由于视频文件都是经过后台编码过,关键帧会被优化,跳转会不准确。可以对比 mp4 与 m3u8,差别会比较大,mp4 拖动很准,m3u8 跳动很大。
    int SetSeek(int millisecond);
    // 跳转到结束,由于 m3u8 跳转不准,有需要跳转到尾部的请使用此接口
    int SeekToEnd(void);
    int SetVolume(int volume);
    // 声音增益,最大可到 1000
    int SetVolumeMax(int volume);
    // 倍数播放
    int SetSpeed(double speed);
    // 截图,注意使用 utf8
    int Screenshot(const char* filename);
       
    // 扬声器热插拔相关
    // 对设备不要求精确到某个设备,可以优化为,收到变动通知,post 到其它线程,再调用 ReloadAudio
    int GetAudioDeviceCount();
    int GetAudioDeviceInfo(int index, char deviceId[PLV_MAX_DEVICE_ID_LENGTH], char deviceName[PLV_MAX_DEVICE_ID_LENGTH]);
    int GetCurrentAudioDevice(char deviceId[PLV_MAX_DEVICE_ID_LENGTH]);
    int SetCurrentAudioDevice(const char deviceId[PLV_MAX_DEVICE_ID_LENGTH]);
    int ReloadAudio();  
};

SDK 注意事项

  1. 所有接口与路径相关,都必须使用 utf8 编码。
  2. 所有回调通知,都不能在里面更新界面或者调用其它 api,更新界面必须 post 到 ui 线程,调用 api 必须在其它线程操作。
  3. 指定 cacert.pem 路径。 SDK 会判断库的路径位置,但有可能存在判断错误,最好的解决方案是调用 PLVSetSdkCacertFile 指定路径。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/715870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ENVI遥感影像处理—水体提取

2 .水体提取 &#xff08;1&#xff09;导入经过大气校正后的影像FLAASH_result.dat。 &#xff08;2&#xff09;选择工具箱中ToolBox——Band Ratio——Band Math&#xff0c;输入(float(b1)-float(b2))/(float(b1)float(b2))&#xff0c;点击Add to List&#xff0c;选中公…

R3LIVE环境搭建

一、安装ros、livox sdk、livox_ros_driver 安装方法[参考] 二、CGAL和pcl_viewer sudo apt-get install libcgal-dev pcl-tools 三、opencv&#xff08;≥3.3&#xff09; 3.1 命令检查 OpenCV 版本&#xff0c;如果 openCV 版本低于 OpenCV-3.3, 更新openCV版本为3.3.1、3…

Kubernetes 多集群管理工具 - Kuboard

Kuboard 是Kubernetes 多集群管理工具&#xff0c;是一个界面化的web网站&#xff0c;使用起来非常方便。在Kuboard中可以导入集群&#xff0c;在kuboard上可以完成很多的运维工作&#xff0c;比如创建命名空间、创建标签、运行服务、修改pod数量等等。 一&#xff1a;kuboard…

【JavaEE初阶】CSS

摄影分享~ 文章目录 一.CSS基本规范1. CSS基本语法规范2.CSS选择器 二.CSS常用属性1. 字体属性2.文本属性3.背景属性4.圆角矩形5.元素的显示模式块级元素行内元素 6.盒子模型边框内边距外边距 7.弹性布局 一.CSS基本规范 层叠样式表。(Cascading Style Sheets) CSS 能够对网页…

【零基础入门学习Python---Python中Web开发基础之快速入门实践】

&#x1f680; 零基础入门学习Python&#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜…

springboot医院自助服务系统-计算机毕设 附源码74853

springboot医院自助服务系统 目 录 摘要 1 绪论 1.1研究意义 1.2研究背景 1.3springboot框架介绍 1.3论文结构与章节安排 2 医院自助服务系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 …

五、Eureka服务注册、续约、剔除、下线源码分析

Eureka 概念的理解 1 服务的注册 当项目启动时&#xff08;eureka 的客户端&#xff09;&#xff0c;就会向 eureka-server 发送自己的元数据&#xff08;原始数据&#xff09;&#xff08;运行的 ip&#xff0c;端口 port&#xff0c;健康的状态监控等&#xff0c;因为使用的…

ICLR 2023 | Self-Consistency: Google超简单方法改善大模型推理能力

大家好&#xff0c;我是HxShine。 今天分享一篇Google Research, Brain Team的一篇文章&#xff0c;SELF-CONSISTENCY IMPROVES CHAIN OF THOUGHT REASONING IN LANGUAGE MODELS[1]&#xff1a;利用自洽性提高语言模型中的思维链推理效果 这篇文章方法非常简单但是效果非常好…

vite配置指定浏览器打开-2023年7月3日

vue3vitevscode-2023年7月3日 官方demo环境下 官方demo环境下 找到vite.config.js增加如下代码 server:{open: {"process.env.BROWSER":C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe}}

docker安装RocketMQ(附填坑经验connect to <172.17.0.3:10909> failed)

目录 一、docker部署RocketMQ1、简易说明2、docker拉取RocketMQ镜像\RocketMQ控制台3、获取RocketMQ配置文件4、RocketMQ配置文件描述5、docker启动RocketMQ6、进入RocketMQ控制台 二、填坑经验错误一: connect to <172.17.0.3:10909> failed错误二: maybe your broker m…

C++静态库与动态库

什么是库 库是写好的现有的&#xff0c;成熟的&#xff0c;可以复用的代码。现实中每个程序都要依赖很多基础的底层库&#xff0c;不可能每个人的代码都从零开始&#xff0c;因此库的存在意义非同寻常。 本质上来说库是一种可执行代码的二进制形式&#xff0c;可以被操作系统…

英伟达新SOTA可对未知物体进行6D追踪和3D重建

物体可以在整个视频中自由移动&#xff0c;甚至经历严重的遮挡。英伟达的方法在目标上与物体级 SLAM 的先前工作类似&#xff0c;但放松了许多常见的假设&#xff0c;从而能够处理遮挡、反射、缺乏视觉纹理和几何线索以及突然的物体运动。 英伟达方法的关键在于在线姿态图优化…

J2EE自定义mvc【框架配置及功能】

目录 一、配置步骤 二、配置框架前三步 导入相应的jar 导入相应的Class 导入xml文件 三、优化基本操作&#xff08;增删改&#xff09; 1、基础优化 编写实体类 编写BookDao类 优化BookDao JUnit测试 2、后台优化 3、前端优化 一、配置步骤 将框架打成jar包&…

SQL Server SQL语句

在很多情况下&#xff0c;可以用CREATE TABLE语句创建数据表、使用ALTER TABLE语句修改表结构、使用DROP TABLE语句删除表&#xff1b; 可以使用CREATE DATABASE创建数据库、ALTER DATABASE修改文件或文件组、DROP DATABASE语句删除数据库&#xff1b; 1、数据定义语句&#x…

web安全php基础_php变量命名及其作用域

php变量命名规则 php变量命名规则 变量以 $ 符号开始&#xff0c;后面跟着变量的名称变量名必须以字母或者下划线字符开始变量名只能包含字母数字字符以及下划线&#xff08;A-z、0-9 和 _ &#xff09;变量名不能包含空格变量名是区分大小写的&#xff08;$y 和 $Y 是两个不…

戴尔笔记本开机输入密码后黑屏只有鼠标,没有桌面的解决参考办法

戴尔笔记本开机输入密码后黑屏只有鼠标&#xff0c;没有桌面的解决参考办法 网络常用方法方法一&#xff1a;cmd启动资源管理器方法二&#xff1a;进入安全模式 以上两个方法我的电脑无效&#xff0c;因此我怀疑是启动项的问题更改启动项 网络常用方法 方法一&#xff1a;cmd启…

道路车辆功能安全第2 部分:功能安全管理

道路车辆功能安全 第2 部分&#xff1a;功能安全管理 1 范围 GB/T 34590的本部分规定了应用于汽车领域的功能安全管理的要求&#xff0c;包括&#xff1a; ——独立于项目的关于所涉及组织的要求&#xff08;整体安全管理&#xff09;&#xff1b;及 ——项目特定的在安全生命周…

zip解压文件,可选择保留的文件夹及该文件夹下的所有文件

zip解压文件&#xff0c;可选择保留的文件夹及该文件夹下的所有文件 代码&#xff1a; zip里面的文件&#xff1a; public static void main(String[] args) {// 要解压的ZIP文件路径String zipFilePath "G:\\WeChat\\WeChat Files\\wxid_aff2r4isimwl22\\FileStorage…

司守奎<数学建模算法应用>第二版----第一章习题解答

司守奎<数学建模算法应用>第二版----第一章习题解答 1.1题目代码 1.2题目 1.3题目代码 1.4题目分析代码 1.1 题目 这道题就是简单的一个线性规划模型,不要求我们自行建立,所以就按照书本上的例题去写就行 代码 % 例题1 %使用matlab解决线性规划问题 %目标函数:z3x1-x2…

GLM-130B本地部署的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…