簡單介紹MFC調用libvlc.dll作一個簡單的播放器,拋磚引玉,各位VC++達人繼續深入研究,Jeremiah對VC++確實不太感興趣,所以就不做太深入的研究了。
2009.10.29修改:加入clip_children屬性設置。參開第1步。
? ? 環境:
? ? ? ? ? ? 1) VC6SP5
? ? ? ? ? ? 2)vlc-0.9.9a
? ? 0. 引言
? ? 根據上一篇博客的研究,任何一個VC環境都可以調用MinGW/Gcc編譯得到的libvlc.dll。VLC在編譯打包之后(也就是執行完makepackage-win32-base),或者去官網下載zip包解壓之后,或者是安裝完VLC之后,在vlc-0.9.9a目錄下有個sdk文件夾,里面又包含兩個文件夾:include--頭文件及lib--庫。這些都是我們用MFC調用libvlc.dll所必須的。頭文件沒啥好說的,庫里面的libvlc.dll.a及libvlccore.dll.a就是上一篇博客所說的靜態庫,我們分別手動改成libvlc.lib及libvlccore.lib就可以在VC環境中調用啦。下面簡要說一下調用的過程,對各位VC++達人來說絕對是小菜一碟。
? ? 1. 建立工程
? ? 新建MFCAppWizard(exe)工程,名字為:MFCVLC。選擇項目為Dialogbased,點擊完成。刪除Dialog窗體上的所有的控件,包括“確定”、“取消”按鈕及"TODO"靜態文本。勾選窗口的clip_children屬性,這樣就會避免拖動、最大化最小化及全屏還原時找不到圖像的缺陷。

? ?
? ? 2. 畫控件
? ? 畫四個控件,兩個靜態文本框,一個輸入框,一個按鈕。其中,第一個靜態文本框修改Caption為“路徑:”,第二個文本框為視頻的顯示區域,所以講ID改為IDC_DISPLAY,Caption去掉。輸入框關聯一個變量,CString類型,命名為m_path。按鈕的Caption改為“播放”,并為BN_CLICKED增加一個Function。在CMFCVLCdlg的構造方法中加入一下語句方便調試。
m_path = _T("d:/01.avi");// 輸入常用的視頻地址

? ?
? ? 3.拷貝vlc的相關庫及頭文件
? ? 在資源管理器的MFCVLC工程目錄下新建文件夾vlc,lib,將vlc-0.9.9a/sdk/include/vlc.h拷貝到MFCVLC工程目錄下,將vlc-0.9.9a/sdk/include除了vlc.h之外的所有文件拷貝到vlc目錄下,將vlc-0.9.9a/sdk/lib下的libvlc.dll.a及libvlccore.dll.a拷貝到lib下,并分別修改為libvlc.lib及libvlccore.lib。將vlc-0.9.9a目錄下的libvlc.dll, libvlccore.dll,plugins目錄拷貝到Debug目錄下。如果有Cygwin環境,需要將stdint.h(/usr/include/stdint.h)這個頭文件也拷貝到MFCVLC工程目錄下。在VC6環境中FileView中新建文件夾及導入上述文件,最后入下圖所示。

? ? 4. 修改頭文件
? ? 1) 修改vlc.h,將所有的#include<***>改為 #include "***"
? ? 2)修改stdint.h,將所有的long long替換為__int64
? ? 3)修改libvlc_structures.h,#include<stdint.h>為#include"stdint.h"
? ? 5. 編寫代碼
? ? 在MFCVLCDlg.cpp中加入頭文件導入。
#include "vlc.h"
? ? 在button的onclick關聯函數中加入代碼:
voidCMFCVLCDlg::OnButton1()? ?
{
? ? //TODO: Add your control notification handler code here
? ? char path[100];
? ? this->GetDlgItemText(IDC_EDIT1,path, 100);
? ? libvlc_exception_tex;
? ? libvlc_exception_init(&ex);
? ? int vlc_argc = 0;
? ? char *vlc_argv[100];
? ? vlc_argv[vlc_argc++] ="--ignore-config";
? ? libvlc_instance_t*p_instance = libvlc_new(
? ? ? ? ? ? vlc_argc,vlc_argv, &ex);
? ? libvlc_media_t *p_media= libvlc_media_new(
? ? ? ? ? ? p_instance,path, &ex);
? ? libvlc_media_player_t*p_media_player? ?
? ? ? ? ? ? =libvlc_media_player_new_from_media(
? ? ? ? ? ? ? ? p_media,&ex);
? ? libvlc_drawable_t hwnd=? ?
? ? ? ? ? ? (libvlc_drawable_t)this->GetDlgItem(IDC_DISPLAY)->GetSafeHwnd();
? ? libvlc_media_player_set_drawable(p_media_player, hwnd,&ex);
? ? libvlc_media_player_play(p_media_player,&ex);
}
? ? 6. 關聯靜態庫及編譯運行
? ? 打開ProjectSetting,在link標簽的Object/library modules:下輸入lib/libvlc.liblib/libvlccore.lib。
? ? build項目,應該沒有錯誤。
? ? Execute Program就可以執行了。
? ? 7. 一個BUG
? ? 第6步執行的是Execute模式,如果是Debug模式,點擊“播放”后,后臺會顯示加載的vlc的plugins的dll的信息,但是加載完最后一個dll的時候程序就Block住了。暫時不曉得為啥。經過更多的測試(win2003虛擬機里的vc6),發現Jeremiah的VC6可能真的有問題,debug的時候,打開Output窗口顯示加載的dll的情況,就會block住。不打開Output窗口偶爾會set_drawable不成功,彈出新窗口。其他幾位朋友測試則正常。
? ? 8. 用VC6以上版本調試結果
? ? Jeremiah使用了vs2003及vs2005。
? ? 1)? ? 會兩個重復定義的錯誤,解決方法是將stdint.h中注釋掉:
#ifndef __intptr_t_defined
#define __intptr_t_defined
//typedef longintptr_t;
#endif
//typedef unsigned longuintptr_t;
? ? 2)發布Release版本會報內存錯誤。具體原因待查,應該是.lib不兼容的問題。不知道為啥Debug版就可以而Release版就不行。解決方法是用dll2lib.exe(附件提供)將0.9.9a的libvlc.dll及libvlccore.dll轉換為相應的lib庫,替換工程的lib/下面的相應的庫,然后再次Release即可。
? ? Jeremiah對MFC只有一點點了解,所以上述的各個過程如果重復煩瑣,及如何修復第7,8步講的BUG及問題,請各位VC++達人指導Jeremiah。先謝過。本文附件中提供了MFCVLC的源碼,只是需要把vlc-0.9.9a的libvlc.dll,libvlccore.dll, plugins目錄拷貝到Debug目錄下就可以編譯執行。需要的自己下載添加調試。
2009.10.29修改:加入clip_children屬性設置。參開第1步。
?
?
?
?
?
?
?

?
?
?


?
?
?

?
?
?
?
?
?

?






















?
?
?
?
?
?
?
?
?





?
?