点播播放器

本文介绍PC应用端,点播播放器的使用流程。

使用流程

  1. 创建点播播放器。

  2. 配置播放器的渲染窗口及设置播放回调。

  3. 根据需求配置播放器的其他参数。例如:软硬解码偏好、视频画面模式等。

  4. 设置播放数据源。

    1. 按文件播放设备录像:调用QueryDeviceVodUrl接口,获取本地NVR设备或IPC设备的存储卡中,指定录像文件名的录像文件rtmp播放地址,并作为数据源设置给播放器。

    2. 按时间播放设备录像:调用QueryDeviceVodUrlByTime接口,获取本地NVR设备或IPC设备存储卡中,指定录像时间范围的录像文件rtmp播放地址,并作为数据源设置给播放器。

    3. 按文件播放云存录像:调用QueryRecordUrl接口查询云端录像文件的hls播放地址,并作为数据源设置给播放器。

  5. 开始播放。

  6. 暂停、恢复、seek操作。

  7. 停止播放。

  8. 销毁点播播放器。

使用示例

设备录像点播

// 创建并显示播放窗口
QPoint playerViewPos = ui->playerviewplaceholder->pos();
QSize playerViewSize = ui->playerviewplaceholder->size();
pLVGLWidget_ = new LVGLWidget(0, this);
pLVGLWidget_->resize(playerViewSize);
pLVGLWidget_->move(playerViewPos);
pLVGLWidget_->show();

// 创建并设置播放器
pLVVodPlayer_ = createLVVodPlayer();
pLVVodPlayer_->setWindow(pLVGLWidget_);
pLVVodPlayer_->setPlayerCallback(this, nullptr);

...
// 处理播放器回调
void VodPlayerWindow::onError(const LVPlayerError &error, void *pUserData) {
    emit appendLog(QString::asprintf("player error: code=%d subCode=%d message=%s", error.code, error.subCode,
                                     error.message.c_str()));
}

void VodPlayerWindow::onPlayerStateChange(LVPlayerState state, void *pUserData) {
    emit appendLog(QString::asprintf("player state changed to %d", state));
}

void VodPlayerWindow::onRenderedFirstFrame(int elapsedTimeInMs, void *pUserData) {
    emit appendLog(QString::asprintf("首帧出图耗时: %d ms", elapsedTimeInMs));
}

void VodPlayerWindow::onVideoSizeChanged(int width, int height, void *pUserData) {
    emit appendLog(QString::asprintf("视频宽高变化:w=%d h=%d", width, height));
}

void VodPlayerWindow::onVodCompletion(void *pUserData) {
    emit appendLog("播放结束");
}

void VodPlayerWindow::onStandardSeiInfoUpdate(const uint8_t *buffer, int length, long timeStamp, void *pUserData) {
   emit appendLog(QString::asprintf("收到sei帧长度%d", length));
}

...
// 设置数据源,rtmp地址从云服务获取
pLVVodPlayer_->setDataSource("rtmp://xx.xx.xx.xx/vod/xxx", true, decryptIvBase64String, decryptKeyBase64String);

// 设置解码策略为硬解码优先
pLVVodPlayer_->setDecoderStrategy(LV_DECODER_STRATEGY_HARDWARE_FIRST);
// 设置画面模式为保持宽高
pLVVodPlayer_->setVideoScalingMode(LV_MEDIA_VIDEO_SCALING_MODE_FIT);
// 设置播放停止时画面保留最后一帧
pLVVodPlayer_->setPlayerStoppedDrawingMode(LV_PLAYER_STOPPED_DRAWING_MODE_ALWAYS_KEEP_LAST_FRAME);
...
// 开始播放
LVPlayerCode code = pLVVodPlayer_->start();
if (code == LV_PLAYER_SUCCESS) {
    emit appendLog("开始播放成功");
} else {
    emit appendLog("开始播放失败");
}
...
// 暂停
pLVVodPlayer_->pause();
...
// 恢复
pLVVodPlayer_->resume();
...
// 停止播放
LVPlayerCode code = pLVVodPlayer_->stop();
if (code == LV_PLAYER_SUCCESS) {
    emit appendLog("停止播放成功");
} else {
    emit appendLog("停止播放失败");
}
...
// 销毁播放器
destroyLVVodPlayer(&pLVVodPlayer_);
delete pLVGLWidget_;

云存录像点播

// 创建并显示播放窗口
QPoint playerViewPos = ui->playerviewplaceholder->pos();
QSize playerViewSize = ui->playerviewplaceholder->size();
pLVGLWidget_ = new LVGLWidget(0, this);
pLVGLWidget_->resize(playerViewSize);
pLVGLWidget_->move(playerViewPos);
pLVGLWidget_->show();

// 创建并设置播放器
pLVVodPlayer_ = createLVVodPlayer();
pLVVodPlayer_->setWindow(pLVGLWidget_);
pLVVodPlayer_->setPlayerCallback(this, nullptr);

...
// 处理播放器回调
void VodPlayerWindow::onError(const LVPlayerError &error, void *pUserData) {
    emit appendLog(QString::asprintf("player error: code=%d subCode=%d message=%s", error.code, error.subCode,
                                     error.message.c_str()));
}

void VodPlayerWindow::onPlayerStateChange(LVPlayerState state, void *pUserData) {
    emit appendLog(QString::asprintf("player state changed to %d", state));
}

void VodPlayerWindow::onRenderedFirstFrame(int elapsedTimeInMs, void *pUserData) {
    emit appendLog(QString::asprintf("首帧出图耗时: %d ms", elapsedTimeInMs));
}

void VodPlayerWindow::onVideoSizeChanged(int width, int height, void *pUserData) {
    emit appendLog(QString::asprintf("视频宽高变化:w=%d h=%d", width, height));
}

void VodPlayerWindow::onVodCompletion(void *pUserData) {
    emit appendLog("播放结束");
}

void VodPlayerWindow::onStandardSeiInfoUpdate(const uint8_t *buffer, int length, long timeStamp, void *pUserData) {
   emit appendLog(QString::asprintf("收到sei帧长度%d", length));
}

...
// 设置数据源,rtmp地址从云服务获取
pLVVodPlayer_->setDataSource("https://xx.xx.xx.xx/hls/xxx.m3u8");

// 设置解码策略为硬解码优先
pLVVodPlayer_->setDecoderStrategy(LV_DECODER_STRATEGY_HARDWARE_FIRST);
// 设置画面模式为保持宽高
pLVVodPlayer_->setVideoScalingMode(LV_MEDIA_VIDEO_SCALING_MODE_FIT);
// 设置播放停止时画面保留最后一帧
pLVVodPlayer_->setPlayerStoppedDrawingMode(LV_PLAYER_STOPPED_DRAWING_MODE_ALWAYS_KEEP_LAST_FRAME);
...
// 开始播放
LVPlayerCode code = pLVVodPlayer_->start();
if (code == LV_PLAYER_SUCCESS) {
    emit appendLog("开始播放成功");
} else {
    emit appendLog("开始播放失败");
}
...
// 暂停
pLVVodPlayer_->pause();
...
// 恢复
pLVVodPlayer_->resume();
...
// 停止播放
LVPlayerCode code = pLVVodPlayer_->stop();
if (code == LV_PLAYER_SUCCESS) {
    emit appendLog("停止播放成功");
} else {
    emit appendLog("停止播放失败");
}
...
// 销毁播放器
destroyLVVodPlayer(&pLVVodPlayer_);
delete pLVGLWidget_;