实现播放功能

更新时间: 2022/06/24 10:00:39

步骤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);
此文档是否对你有帮助?
有帮助
去反馈
  • 步骤1 创建播放器实例
  • 步骤2 注册获取消息的回调
  • 步骤3 注册接收资源释放成功消息的回调
  • 步骤4 注册接收视频数据的回调
  • 步骤5 设置视频播放窗口
  • 步骤6 设置拉流超时时间
  • 步骤7 初始化播放参数
  • 步骤8 预处理播放
  • 步骤9 开始播放