請移步https://higoge.github.io/,全部下載資料在那個博客都能找到。謝謝。 c++
--------------------------------------------------------------------git
本篇博客將簡單介紹MFC調用libvlc.dll做一個簡單的播放器,拋磚引玉,各位VC++達人繼續深刻研究,Jeremiah對VC++確實不太感興趣,因此就不作太深刻的研究了。
github
2009.10.29修改:加入clip_children屬性設置。參考第1步。ide
2010.04.14修改:中文路徑問題。參考第7步。函數
環境:
1) VC6 SP5
2) vlc-0.9.9a測試
0. 引言
根據上一篇博客的研究,任何一個VC環境均可以調用MinGW/Gcc編譯獲得的libvlc.dll。VLC在編譯打包以後(也就是執行完make package-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++達人來講絕對是小菜一碟。ui
1. 創建工程
新建MFC AppWizard(exe)工程,名字爲:MFCVLC。選擇項目爲Dialog based,點擊完成。刪除Dialog窗體上的全部的控件,包括「肯定」、「取消」按鈕及"TODO"靜態文本。勾選窗口的clip_children屬性,這樣就會避免拖動、最大化最小化及全屏還原時找不到圖像的缺陷。this
2. 畫控件
畫四個控件,兩個靜態文本框,一個輸入框,一個按鈕。其中,第一個靜態文本框修改Caption爲「路徑:」,第二個文本框爲視頻的顯示區域,因此講ID改成IDC_DISPLAY,Caption去掉。輸入框關聯一個變量,CString類型,命名爲m_path。按鈕的Caption改成「播放」,併爲BN_CLICKED增長一個Function。在CMFCVLCdlg的構造方法中加入一下語句方便調試。spa
m_path = _T("d:/01.avi"); // 輸入經常使用的視頻地址debug
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關聯函數中加入代碼:
void CMFCVLCDlg::OnButton1()
{
// TODO: Add your control notification handler code here
char path[100];
this->GetDlgItemText(IDC_EDIT1, path, 100);
libvlc_exception_t ex;
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);
}
7. 兩個BUG
第6步執行的是Execute模式,若是是Debug模式,點擊「播放」後,後臺會顯示加載的vlc的plugins的dll的信息,可是加載完最後一個dll的時候程序就Block住了。暫時不曉得爲啥。通過更多的測試(win2003虛擬機裏的vc6),發現Jeremiah的VC6可能真的有問題,debug的時候,打開Output窗口顯示加載的dll的狀況,就會block住。不打開Output窗口偶爾會set_drawable不成功,彈出新窗口。其餘幾位朋友測試則正常。
上面的代碼若是開帶中文路徑的地址會沒法打開,由於傳入的中文路徑vlc識別不了。須要將路徑也就是path變量從ANSIZ轉換爲UTF8代碼。具體怎麼轉換,各位VC達人本身研究吧。
8. 用VC6以上版本調試結果
Jeremiah使用了vs2003及vs2005。
1) 會兩個重複定義的錯誤,解決方法是將stdint.h中註釋掉:
#ifndef __intptr_t_defined
#define __intptr_t_defined
//typedef long intptr_t;
#endif
//typedef unsigned long uintptr_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目錄下就能夠編譯執行。須要的本身下載添加調試。