plv player sdk doc
功能使用

  • 功能使用
    • SDK 名词含义及功能说明 "SDK 名词含义及功能说明"
    • SDK 全局函数 "SDK 全局函数"
    • SDK 防录制功能 "SDK 防录制功能"
    • SDK 下载器 "SDK 下载器"
    • SDK 播放器 "SDK 播放器"
    • SDK 注意事项 "SDK 注意事项"
    • SDK 接口文档 "SDK 接口文档"

本文档提供了使用 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 请求网络数据
    // 设置结束播放之后保留最后的画面
    // 设置硬解码
    // 设置 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();
    PLAYERSDK_API int PLAYERSDK_CALL PLVSetSdkKeepLastFrame(bool enable)
    设置是否播放结束保持在最后一帧画面上.
    PLAYERSDK_API int PLAYERSDK_CALL PLVSetSdkHttpRequest(SDK_HTTP_REQUEST type)
    设置 SDK 的网络请求协议.
    PLAYERSDK_API int PLAYERSDK_CALL PLVInitSdkLibrary(const char *userId, const char *secretKey, const char *readToken)
    初始化 SDK , 在使用 SDK 前一定要调用此接口.
    PLAYERSDK_API const char *PLAYERSDK_CALL PLVGetSdkVersion(void)
    获取 SDK 版本号.
    PLAYERSDK_API const char *PLAYERSDK_CALL PLVGetSdkErrorDescription(int err)
    根据错误码获取错误描述.
    PLAYERSDK_API int PLAYERSDK_CALL PLVSetSdkLogFile(const char *fileName)
    设置 SDK 的日志文件位置, 文件名带路径.
    PLAYERSDK_API int PLAYERSDK_CALL PLVSetSdkHwdecEnable(bool enable)
    设置是否使用硬件加速.
    PLAYERSDK_API int PLAYERSDK_CALL PLVSetSdkViewerInfo(const char *viewerId, const char *viewerName, const char *viewerAvatar, const char *viewerExtraInfo1=NULL, const char *viewerExtraInfo2=NULL, const char *viewerExtraInfo3=NULL)
    设置 qos 的信息追踪, 建议设置, 在 vrm12 中, 如果不设置 viewerId, 会播放失败.
    @ FIRST_HTTPS_REQUEST

SDK 防录制功能

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

// 注意通知回调都是子线程,如果更新 ui 及操作 api 都需要 post 到主线程
class Record{
public:
Record(void){
// 软件破解注入通知
// 有插件注入通知,可能有软件在录制你的播放界面,可以在业务上做处理
// 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);
}
};
PLAYERSDK_API int PLAYERSDK_CALL PLVSetPluginInjectHandler(bool enable, OnPluginInjectHandler handler, void *data)
设置恶意软件录制的回调通知, 如果有恶意软件录制播放窗口, 会触发回调通知.
PLAYERSDK_API int PLAYERSDK_CALL PLVGetPreventRecord(void *window, bool *enable)
获取播放窗口是否开启软件防录制.
PLAYERSDK_API int PLAYERSDK_CALL PLVSetHDMIDeviceChangedHandler(bool enable, OnHDMIDeviceChangedHandler handler, void *data)
设置 HDMI 设备插拔变动的回调通知.
HDMI_DEVICE_TYPE

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);
}
};
PLAYERSDK_API PLVDownloadPtr PLAYERSDK_CALL PLVDownloadCreate()
创建下载对象并返回对象指针. 在使用下载接口对象前, 必须先调用此接口创建对象.
PLAYERSDK_API int PLAYERSDK_CALL PLVDownloadDelete(PLVDownloadPtr download)
删除视频文件. 如果视频正在下载中时, 会中断下载, 并删除所有临时文件.
void * PLVDownloadPtr
下载对象, 每一个下载任务对应一个下载对象, 可以创建多个下载对象.
PLAYERSDK_API int PLAYERSDK_CALL PLVDownloadSetErrorHandler(PLVDownloadPtr download, OnDownloadErrorHandler handler, void *data)
设置下载错误的回调通知.
PLAYERSDK_API int PLAYERSDK_CALL PLVDownloadPause(PLVDownloadPtr download)
暂停下载, 此时线程进入休眠, 不会退出, 区别于停止下载. 再开始下载时会更快些.
PLAYERSDK_API int PLAYERSDK_CALL PLVDownloadSetVideo(PLVDownloadPtr download, const char *vid, const char *path, int rate)
设置视频信息. 在调用下载前, 必须先设置视频的相关信息, 否则会报错.
PLAYERSDK_API int PLAYERSDK_CALL PLVDownloadSetResultHandler(PLVDownloadPtr download, OnDownloadResultHandler handler, void *data)
设置下载结果的回调通知.
PLAYERSDK_API int PLAYERSDK_CALL PLVDownloadStop(PLVDownloadPtr download)
停止下载, 此时线程会回收退出, 区别于暂停下载. 再开始下载时会慢些.
PLAYERSDK_API int PLAYERSDK_CALL PLVDownloadStart(PLVDownloadPtr download, bool autoDownRate)
开始下载.
PLAYERSDK_API void PLAYERSDK_CALL PLVDownloadDestroy(PLVDownloadPtr download)
销毁下载对象. 不再使用创建的对象后, 必须调用此接口回收.
PLAYERSDK_API int PLAYERSDK_CALL PLVDownloadSetProgressHandler(PLVDownloadPtr download, OnDownloadProgressHandler handler, void *data)
设置下载进度的回调通知.

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);
// 跳转,注意 exactSeek 为精确跳转,会较慢;但由于视频文件都是经过后台编码过,关键帧会被优化,跳转会不准确。可以对比 mp4 与 m3u8,差别会比较大,mp4 拖动很准,m3u8 跳动很大。
int SetSeek(int millisecond, bool exactSeek);
// 跳转到结束,由于 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();
};
PLAYERSDK_API int PLAYERSDK_CALL PLVPlayerSetPropertyHandler(PLVPlayerPtr player, OnPlayerPropertyHandler handler, void *data)
设置播放属性值的回调通知.
PLAYERSDK_API int PLAYERSDK_CALL PLVPlayerSetOSDConfig(PLVPlayerPtr player, bool enable, const OSDConfigInfo *config)
设置跑马灯信息
PLAYERSDK_API PLVPlayerPtr PLAYERSDK_CALL PLVPlayerCreate(void *window)
创建播放对象并返回对象指针. 在使用播放接口对象前, 必须先调用此接口创建对象.
PLAYERSDK_API int PLAYERSDK_CALL PLVPlayerSetProgressHandler(PLVPlayerPtr player, OnPlayerProgressHandler handler, void *data)
设置播放进度的回调通知.
PLAYERSDK_API void PLAYERSDK_CALL PLVPlayerDestroy(PLVPlayerPtr player)
销毁播放对象. 不再使用创建的对象后, 必须调用此接口回收.
PLAYERSDK_API int PLAYERSDK_CALL PLVPlayerSetStateHandler(PLVPlayerPtr player, OnPlayerStateHandler handler, void *data)
设置播放状态的回调通知.
PLAYERSDK_API int PLAYERSDK_CALL PLVPlayerSetAudioDeviceHandler(PLVPlayerPtr player, OnPlayerAudioDeviceHandler handler, void *data)
设置扬声器热插拔的回调通知.
PLAYERSDK_API int PLAYERSDK_CALL PLVPlayerSetRateChangeHandler(PLVPlayerPtr player, OnPlayerRateChangeHandler handler, void *data)
设置清晰度变化的回调通知. 只有输入清度为 VIDEO_RATE_AUTO 才会触发此回调.
PLAYERSDK_API int PLAYERSDK_CALL PLVPlayerGetOSDConfig(PLVPlayerPtr player, OSDConfigInfo &config)
获取跑马灯信息.
const int PLV_MAX_DEVICE_ID_LENGTH

SDK 注意事项

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