LibVLC環境的搭建
最近又 LIBVLC 做一個視頻播放器,封裝成ActiveX控件,之前做過一個基於OpenCV的播放器(只解碼視頻,音頻不用,OpenCV也沒有解碼音頻的功能)。
到目前位置完成的功能有
設置文件名、播放、暫停/繼續、獲得視頻長度、獲得視頻播放時間、設置視頻播放位置(時間)、逐幀播放、停止、設置下一個播放的絕對時間(年 月 日 時 分 秒 毫秒)、設置視頻開始位置的絕對時間(年 月 日 時 分 秒 毫秒)、全屏/恢復、獲得視頻播放速度、設置視頻播放速度(快、慢)、截圖; 以及視頻的開始位置絕對時間的7個屬性(年 月 日 時 分 秒 毫秒)以及他們的Get/Set方法。
在做全屏的時候遇到一個問題,libvlc給了三個和全屏有關的API,如下:
//切換全屏 / 恢復
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 );
但是、可是、可但是,在該頭文件中又說了:
* @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.
歌詞大意是:在許多窗口管理器中,只有一個top-level window可以設置為full-screen模式。 因此當使用函數libvlc_media_player_set_xwindow() 來將視頻嵌入到一個non-top-level window的時候,可能不會起作用(編者注:確實是這樣,確實特么不起作用)。 這種情況下,這個嵌入的窗口必須將其父窗口設置為root window(編者注:Windows下的root window應該就是desktop窗口了)以便將全屏模式啟用。 當取消全屏的時候你就要重新將他的父窗口設置為普通的窗口。
---------------------------------------------------------------
接着說
在全屏的時候,需要將控件窗口的設置為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); }
環境搭建
1、去官網下載播放器(安裝后附帶SDK)
2、安裝完成后,將安裝目錄下 SDK\include 和 SDK\lib 拷貝到工程目錄下
拷貝到工程目錄下
當前圖目錄為工程目錄,即解決方案所在目錄
3、將VLC安裝目錄下的plugins目錄、libvlc.dll、libvlccore.dll 拷貝至工程的debug 或 release目錄下
拷貝至debug目錄下
4、在VS的項目屬性里,添加頭文件和庫文件的目錄
5、在工程的合適位置引用頭文件、導入庫
#include <vlc/vlc.h>
#pragma comment(lib, "libvlc.lib")
#pragma comment(lib, "libvlccore.lib")
以上