nim_duilib加libvlc制作简单播放器

前期的贮备知识点

1.nim_duilib中的如何生成一个带窗口句柄的控件

2.libvlc相关接口的使用,以及播放视频需要对应的窗口句柄作为播放视频源的载体

3.libvlc里面对应的一些事件处理

网上有很多关于duilib的例子 但是网易云信这版的就不多,不过幸好这两个玩意儿 大同小异,有很多可以参考的地方 一个问题一个问题来看

问题1 如何生成一个带窗口句柄的控件

假设我们设置的这个控件的类为 VlcPlayForm 实现如下

#pragma once

#include "Resource.h"
#include "stdafx.h"

class VlcPlayForm : public ui::Control
{
public:
    VlcPlayForm(void) { m_hwnd = NULL; };
    ~VlcPlayForm(void) {};

    virtual void SetInternVisible(bool bVisible = true)
    {
        __super::SetInternVisible(bVisible);
        ::ShowWindow(m_hwnd, bVisible);
    }

    virtual void SetPos(RECT rc)
    {
        __super::SetPos(rc);
        ::SetWindowPos(m_hwnd, NULL, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, SWP_SHOWWINDOW); //SWP_SHOWWINDOW     //SWP_NOZORDER | SWP_NOACTIVATE
    }

    BOOL Attach(HWND hWndNew)
    {
        if (!::IsWindow(hWndNew))
        {
            return FALSE;
        }

        m_hwnd = hWndNew;
        return TRUE;
    }

    HWND Detach()
    {
        HWND hWnd = m_hwnd;
        m_hwnd = NULL;
        return hWnd;
    }

    HWND Gethwnd() { return m_hwnd; }

protected:
	HWND m_hwnd;
};

在nim_duilib中 要使用自定义控件需要重写一个函数

virtual ui::Control* CreateControl(const std::wstring& pstrClass);

这个函数的实现如下:

ui::Control* BasicForm::CreateControl(const std::wstring& pstrClass)
{
	//自定义一个控件来提供句柄
	ui::Control* pControl = NULL;
	if (L"vlcform" == pstrClass)
	{
		pControl = new VlcPlayForm();
		HWND hwnd = ::CreateWindow(L"STATIC", L"", WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, GetHWND(), NULL, NULL, NULL);  //GetActiveWindow()
		static_cast<VlcPlayForm*>(pControl)->Attach(hwnd);
	}

	return pControl;
}

通过这一步 就新建了一个带句柄的窗口

XML定义如下

<vlcform name="show_video" width="stretch" height="stretch" />

2.介绍下相应的libvlc的接口

libvlc_media_player_stop                        //停止 释放资源的时候需要用到此函数

libvlc_media_player_get_length             //获取文件总的播放时长

libvlc_media_player_get_time                //获取当前播放的时长

libvlc_media_player_get_position          //获取播放的位置

libvlc_media_player_set_position          //设置播放的位置

libvlc_media_player_play                       //播放

libvlc_media_player_pause                    //暂停

libvlc_media_player_release                 //释放资源

libvlc_release                                        //释放资源

libvlc_new                                             //申请资源

libvlc_media_new_location                  //创建一个指定的媒体资源,例如一个URL

libvlc_media_player_new_from_media        //创建一个媒体播放器对象

libvlc_media_release                               //释放一个媒体播放器对象

libvlc_media_player_set_hwnd                //设置播放的窗口句柄

libvlc_media_player_play                        //设置媒体player

3. libvlc的事件处理

void OnVLC_Event(const libvlc_event_t* event, void* data);

libvlc_event_manager_t* vlc_evt_man = libvlc_media_player_event_manager(m_player);
libvlc_event_attach(vlc_evt_man, libvlc_MediaPlayerPlaying, OnVLC_Event, this);

通过这种方式可以获取到libvlc的各种事件信息,常用的有:

    libvlc_MediaPlayerPlaying,
    libvlc_MediaPlayerPaused,
    libvlc_MediaPlayerStopped,

通过这些枚举的事件定义 可以很好的得到libvlc相关的状态回调事件 事件定义在 libvlc_events.h文件中;

Guess you like

Origin blog.csdn.net/Wuzm_/article/details/121556632