实现播放功能
更新时间: 2024/08/07 10:23:29
步骤1 创建播放器实例
调用 Nelp_Create(const char *paLogPath, NELP_OUT _HNLPSERVICE *phNLPService)
创建播放器实例。
参数说明如下:
参数 | 说明 |
---|---|
paLogPath | 日志文件的输出路径。如果设为NULL ,则默认保存到当前的工作目录下。 |
phNLPService | 输出参数,返回创建成功的播放器实例。 |
示例代码
_HNLPSERVICE m_hNelpService = NULL;
if (NELP_OK != Nelp_Create("E:\\log", &m_hNelpService)) {
// 创建失败
}
else {
// 创建成功
assert(m_hNelpService != NULL);
}
步骤2 注册获取消息的回调
注册获取消息的回调需要在 Nelp_PrepareToPlay
前调用。
播放器 SDK 在整个播放过程中会有一些状态消息的回调,开发者需要调用 Nelp_RegisterMessageCB(_HNLPSERVICE hNLPService, PFN_NELP_MESSAGE_CB pMessageCB)
接口进行注册才能收到相应的消息回调。
参数说明如下:
参数 | 说明 |
---|---|
hNLPService | 创建成功的播放器实例。 |
pMessageCB | 接收消息的回调,开发者需要自己实现该回调来处理相应的消息,消息类型参见PFN_NELP_MESSAGE_CB。 |
示例代码
void getMessage(ST_NELP_MESSAGE msg);
Nelp_RegisterMessageCB(m_hNelpService, getMessage);
void getMessage(ST_NELP_MESSAGE msg) {
switch (msg.iWhat) {
case NELP_MSG_ERROR:
break;
case NELP_MSG_PREPARED:
break;
case NELP_MSG_VIDEO_SIZE_CHANGED:
break;
case NELP_MSG_BUFFERING_START:
break;
case NELP_MSG_BUFFERING_END:
break;
case NELP_MSG_COMPLETED:
break;
case NELP_MSG_VIDEO_RENDERING_START:
break;
case NELP_MSG_AUDIO_RENDERING_START:
break;
case NELP_MSG_PLAYBACK_STATE_CHANGED:
break;
case NELP_MSG_AUDIO_DEVICE_OPEN_FAILED:
break;
case NELP_MSG_SEEK_COMPLETED:
break;
case NELP_MSG_VIDEO_PARSE_ERROR:
break;
default:
break;
}
}
步骤3 注册接收资源释放成功消息的回调
注册接收资源释放成功消息的回调需要在 Nelp_PrepareToPlay
前调用。
播放器退出播放需要调用Nelp_Shutdown
接口来释放相关的资源,当前版本中,资源释放的过程是同步的,释放结束后会上报资源释放成功的消息,开发者调用 Nelp_RegisterResourceReleaseSuccessCB(_HNLPSERVICE hNLPService, P_NELP_RESOURCE_RELEASE_SUCCESS_CB pReleaseCB)
接口注册回调函数就可以收到该消息。
参数说明如下:
参数 | 说明 |
---|---|
hNLPService | 创建成功的播放器实例。 |
pReleaseCB | 接收资源释放成功消息的回调,开发者需要自己实现该回调来做一些资源释放成功后的操作。 |
示例代码
void resourceReleaseSuccess();
Nelp_RegisterResourceReleaseSuccessCB(m_hNelpService, resouceReleaseSuccess);
void resourceReleaseSuccess() {
// 资源释放成功了
}
如果退出后还需要重新开启播放的话,需要等到Nelp_Shutdown结束的消息后,才能开始下一次播放,防止内存泄漏。
步骤4 注册接收视频数据的回调
- 注册接收视频数据的回调需要在
Nelp_PrepareToPlay
前调用。 - 若不需要得到视频数据则该步骤忽略。
播放器 SDK 支持解码后的视频数据的回调,若开发者需要得到解码后的视频数据来进行显示或者处理,则可以调用 Nelp_RegisterGetVideoFrameCB(_HNLPSERVICE hNLPService, EN_NELP_MEDIA_FORMAT eMFormat, NELP_OUT P_NELP_VIDEO_FRAME_CB pVideoFrameCB)
接口来进行注册。
参数说明如下:
参数 | 说明 |
---|---|
hNLPService | 创建成功的播放器实例。 |
eMFormat | 希望获取的视频数据的格式。 |
pVideoFrameCB | 获取视频数据的回调。 |
示例代码
void getVideoFrame(ST_NELP_FRAME *frame);
// 不使用sdk内置显示模块进行显示,回调的视频数据格式是YUV420
Nelp_RegisterGetVideoFrameCB(m_hNelpService, EN_YUV420, getVideoFrame);
void getVideoFrame(ST_NELP_FRAME *frame)
{
switch (frame->enMFormat) {
case EN_ARGB8888:
// ARGB8888 数据格式
break;
case EN_YUV420:
// YUV420 数据格式
break;
default:
break;
}
}
步骤5 设置视频播放窗口
设置视频播放窗口必须在UI线程调用。
播放器 SDK 内置了视频显示模块。开发者可以调用Nelp_SetDisplay(_HNLPSERVICE hNLPService, void *wnd, ST_NELP_RECT* pstRenderRect)
接口将 HWND 句柄和绘制区域传递给SDK,让 SDK 在 wnd 指定窗口(或控件)上绘制视频画面,播放过程中也可多次调用此接口来更新绘制区域。若开发者希望自己绘制,请参见[步骤4 注册接收视频数据的回调](#步骤4 注册接收视频数据的回调)。
参数说明如下:
参数 | 说明 |
---|---|
hNLPService | 创建成功的播放器实例。 |
wnd | 显示窗口(或控件)的HWND句柄。 |
pstRenderRect | 画面在窗口控件上的区域。 |
示例代码
HWND wnd;
CWnd *pWnd = (CWnd *)GetDlgItem(IDC_RENDER);
wnd = pWnd->GetSafeHwnd();
if (NELP_OK != Nelp_SetDisPlay(m_hNelpService, wnd, {0, 0, 1280, 720})) {
return; // 设置不成功
}
步骤6 设置拉流超时时间
设置拉流超时时间必须在 Nelp_PrepareToPlay
前调用。
调用Nelp_SetPlaybackTimeout(_HNLPSERVICE hNLPService, int timeout)
接口设置预处理播放(Nelp_PrepareToPlay)时的拉流超时时间。
若不设置或设置的时间无效,则 SDK 使用默认超时时间 30 秒。
参数说明如下:
参数 | 说明 |
---|---|
hNLPService | 创建成功的播放器实例。 |
timeout | 超时时间,单位:s。 |
示例代码
Nelp_SetPlaybackTimeout(m_hNelpService, 10); //设置拉流超时时间为10秒
步骤7 初始化播放参数
初始化播放参数必须在 Nelp_PrepareToPlay
前调用。
上述操作完成后,需要初始化播放所需的相关参数,如播放地址、缓冲模式。
调用Nelp_InitParam(_HNLPSERVICE hNLPService, ST_NELP_PARAM *pstParam)
接口进行初始化设置。
参数说明如下:
参数 | 说明 |
---|---|
hNLPService | 创建成功的播放器实例。 |
pstParam | 相关参数的结构体变量。 |
示例代码
ST_NELP_PARAM stNelpParam = { 0 };
typedef enum en_NELP_STREAM_TYPE {
en_LIVESTREAMING, // 直播流
en_ONDEMAND // 点播流
} EN_NELP_STREAM_TYPE;
char *url = "http://xxx.xxx.xxx.xxx/xxx.flv"; // 播放地址
EN_NELP_STREAM_TYPE m_streamType; // 流类型,直播还是点播
m_streamType = en_LIVESTREAMING; // 为直播流,该处为示例代码,开发者需要根据实际情况进行设置
stNelpParam.paPlayUrl = url;
if (m_streamType == en_LIVESTREAMING) { // 直播流
stNelpParam.enBufferStategy = EN_NELP_LOW_DELAY; // 采用直播低延时模式
}
else if (m_streamType == en_ONDEMAND) { // 点播流
stNelpParam.enBufferStategy = EN_NELP_ANTI_JITTER; // 采用点播抗抖动模式
}
// 初始化相关参数
if (NELP_OK != Nelp_InitParam(m_hNelpService, &stNelpParam)) {
// 初始化失败
return;
}
步骤8 预处理播放
预处理播放主要任务是创建各个模块的线程、开始拉流、解析、解码等。
调用 Nelp_PrepareToPlay(_HNLPSERVICE hNLPService)
接口进行预处理播放。
参数说明如下:
参数 | 说明 |
---|---|
hNLPService | 创建成功的播放器实例。 |
示例代码
Nelp_PrepareToPlay(m_hNelpService);
预处理完成后会收到NELP_MSG_PREPARED
的消息。
若预处理过程中出现拉流失败,播放出错等问题,则会收到NELP_MSG_ERROR
的消息。
步骤9 开始播放
在调用 Nelp_PrepareToPlay
接口并且收到NELP_MSG_PREPARED
消息后,需要调用 Nelp_Start(_HNLPSERVICE hNLPService)
接口进行播放。
- 若未等待
NELP_MSG_PREPARED
消息就立刻调用Nelp_Start(_HNLPSERVICE hNLPService)
接口开始播放,接口会阻塞直到播放器预处理完成。 - 由于
Nelp_Start(_HNLPSERVICE hNLPService)
接口涉及视频画面渲染的一些对象创建,因此应当在程序的 UI 线程调用。
参数说明如下:
参数 | 说明 |
---|---|
hNLPService | 创建成功的播放器实例。 |
示例代码
Nelp_Start(m_hNelpService);