前期的贮备知识点
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(pControl)->Attach(hwnd); } return pControl; }
通过这一步 就新建了一个带句柄的窗口
XML定义如下
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文件中;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)