VS2010下 LibVLC開發環境搭建

LibVLC環境的搭建 windows

最近又 LIBVLC 作一個視頻播放器,封裝成ActiveX控件,以前作過一個基於OpenCV的播放器(只解碼視頻,音頻不用,OpenCV也沒有解碼音頻的功能)。ide

到目前位置完成的功能有函數

設置文件名、播放、暫停/繼續、得到視頻長度、得到視頻播放時間、設置視頻播放位置(時間)、逐幀播放、中止、設置下一個播放的絕對時間(年 月 日 時 分 秒 毫秒)、設置視頻開始位置的絕對時間(年 月 日 時  分 秒  毫秒)、全屏/恢復、得到視頻播放速度、設置視頻播放速度(快、慢)、截圖; 以及視頻的開始位置絕對時間的7個屬性(年 月 日 時 分 秒 毫秒)以及他們的Get/Set方法。this

在作全屏的時候遇到一個問題,libvlc給了三個和全屏有關的API,以下:spa

 

//切換全屏 / 恢復
LIBVLC_API void libvlc_toggle_fullscreen( libvlc_media_player_t *p_mi ); //設置全屏 / 恢復,由b_fullscreen決定
LIBVLC_API void libvlc_set_fullscreen( libvlc_media_player_t *p_mi, int b_fullscreen ); //獲取是否全屏
LIBVLC_API int libvlc_get_fullscreen( libvlc_media_player_t *p_mi );

 

 

可是、但是、可可是,在該頭文件中又說了:debug

* @warning With most window managers, only a top-level windows can be in
* full-screen mode. Hence, this function will not operate properly if
* libvlc_media_player_set_xwindow() was used to embed the video in a
* non-top-level window. In that case, the embedding window must be reparented
* to the root window <b>before</b> fullscreen mode is enabled. You will want
* to reparent it back to its normal parent when disabling fullscreen.3d

 

歌詞大意是:在許多窗口管理器中,只有一個top-level window能夠設置爲full-screen模式。 所以當使用函數libvlc_media_player_set_xwindow() 來將視頻嵌入到一個non-top-level window的時候,可能不會起做用(編者注:確實是這樣,確實特麼不起做用)。 這種狀況下,這個嵌入的窗口必須將其父窗口設置爲root window(編者注:Windows下的root window應該就是desktop窗口了)以便將全屏模式啓用。 當取消全屏的時候你就要從新將他的父窗口設置爲普通的窗口。code

 

---------------------------------------------------------------orm

接着說視頻

在全屏的時候,須要將控件窗口的設置爲top-level window,方法就是去除WS_CHILD屬性,而後將其父窗口設置爲desktop。

恢復時,將其位置放在原來的合適位置,將其父窗口設置爲原來的,將其窗口風格恢復。

 

if (b == true) { //此時不是全屏, 要全屏
        m_hWndParent = GetParent()->m_hWnd;     //父窗口句柄
        int cx = GetSystemMetrics(SM_CXSCREEN); int cy = GetSystemMetrics(SM_CYSCREEN); GetWindowRect(&m_rectPlayer);                  //本視頻窗口大小 //得到其窗口風格
        m_lStyle = GetWindowLong(m_hWnd, GWL_STYLE); m_lStyleEx = GetWindowLong(m_hWnd, GWL_EXSTYLE); SetWindowLong(m_hWnd, GWL_STYLE, m_lStyle | ~WS_CHILD | ~WS_CHILDWINDOW | ~WS_BORDER); SetWindowLong(m_hWnd, GWL_EXSTYLE, m_lStyleEx | ~WS_EX_CLIENTEDGE); HWND hWndDesktop = GetDesktopWindow()->GetSafeHwnd(); HWND hParentWnd = ::SetParent(m_hWnd, hWndDesktop); HWND hTemp = ::GetParent(m_hWnd); ::MoveWindow(m_hWnd, 0, 0, cx, cy, TRUE); //::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_DEFERERASE | SWP_NOMOVE | SWP_NOSIZE); 
 } else { SetParent(FromHandle(m_hWndParent)); //恢復原來的父窗口
 CPoint leftTop(m_rectPlayer.TopLeft()); CPoint bottomRight(m_rectPlayer.BottomRight()); ::ScreenToClient(m_hWndParent, &leftTop); ::ScreenToClient(m_hWndParent, &bottomRight); //恢復其窗口屬性
 SetWindowLong(m_hWnd, GWL_STYLE, m_lStyle); SetWindowLong(m_hWnd, GWL_EXSTYLE, m_lStyleEx); ::MoveWindow(m_hWnd, leftTop.x, leftTop.y, m_rectPlayer.Width(), m_rectPlayer.Height(), TRUE); ::SetWindowPos(m_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); }

 

 

 

 

環境搭建

一、去官網下載播放器(安裝後附帶SDK)

    地址 http://www.videolan.org/

 

二、安裝完成後,將安裝目錄下 SDK\include 和 SDK\lib 拷貝到工程目錄下

 

 

 

拷貝到工程目錄下

當前圖目錄爲工程目錄,即解決方案所在目錄

 

 

三、將VLC安裝目錄下的plugins目錄、libvlc.dll、libvlccore.dll 拷貝至工程的debug 或 release目錄下

 

 

拷貝至debug目錄下

 

 四、在VS的項目屬性裏,添加頭文件和庫文件的目錄

 

 

 

 五、在工程的合適位置引用頭文件、導入庫

#include <vlc/vlc.h>
#pragma comment(lib, "libvlc.lib")
#pragma comment(lib, "libvlccore.lib")

 

  以上

相關文章
相關標籤/搜索