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)
二、安裝完成後,將安裝目錄下 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")
以上