利用MFC調用libvlc.dll作一個簡單的播放器

簡單介紹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屬性,這樣就會避免拖動、最大化最小化及全屏還原時找不到圖像的缺陷。

利用MFC調用libvlc.dll作一個簡單的播放器
? ?
? ? 2. 畫控件
? ?畫四個控件,兩個靜態文本框,一個輸入框,一個按鈕。其中,第一個靜態文本框修改Caption為“路徑:”,第二個文本框為視頻的顯示區域,所以講ID改為IDC_DISPLAY,Caption去掉。輸入框關聯一個變量,CString類型,命名為m_path。按鈕的Caption改為“播放”,并為BN_CLICKED增加一個Function。在CMFCVLCdlg的構造方法中加入一下語句方便調試。

利用MFC調用libvlc.dll作一個簡單的播放器m_path = _T("d:/01.avi");// 輸入常用的視頻地址


利用MFC調用libvlc.dll作一個簡單的播放器
? ?
? ? 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中新建文件夾及導入上述文件,最后入下圖所示。

利用MFC調用libvlc.dll作一個簡單的播放器

? ? 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中加入頭文件導入。

利用MFC調用libvlc.dll作一個簡單的播放器#include "vlc.h"


? ?在button的onclick關聯函數中加入代碼:
利用MFC調用libvlc.dll作一個簡單的播放器voidCMFCVLCDlg::OnButton1()? ?
利用MFC調用libvlc.dll作一個簡單的播放器{
利用MFC調用libvlc.dll作一個簡單的播放器??//TODO: Add your control notification handler code here
利用MFC調用libvlc.dll作一個簡單的播放器? ? char path[100];
利用MFC調用libvlc.dll作一個簡單的播放器? ? this->GetDlgItemText(IDC_EDIT1,path, 100);
利用MFC調用libvlc.dll作一個簡單的播放器? ? libvlc_exception_tex;
利用MFC調用libvlc.dll作一個簡單的播放器? ?libvlc_exception_init(&ex);
利用MFC調用libvlc.dll作一個簡單的播放器? ? int vlc_argc = 0;
利用MFC調用libvlc.dll作一個簡單的播放器? ? char *vlc_argv[100];
利用MFC調用libvlc.dll作一個簡單的播放器? ? vlc_argv[vlc_argc++] ="--ignore-config";
利用MFC調用libvlc.dll作一個簡單的播放器? ? libvlc_instance_t*p_instance = libvlc_new(
利用MFC調用libvlc.dll作一個簡單的播放器? ???? ? vlc_argc,vlc_argv, &ex);
利用MFC調用libvlc.dll作一個簡單的播放器? ? libvlc_media_t *p_media= libvlc_media_new(
利用MFC調用libvlc.dll作一個簡單的播放器? ???? ? p_instance,path, &ex);
利用MFC調用libvlc.dll作一個簡單的播放器? ? libvlc_media_player_t*p_media_player? ?
利用MFC調用libvlc.dll作一個簡單的播放器? ?????=libvlc_media_player_new_from_media(
利用MFC調用libvlc.dll作一個簡單的播放器? ?????? ?p_media,&ex);
利用MFC調用libvlc.dll作一個簡單的播放器? ? libvlc_drawable_t hwnd=? ?
利用MFC調用libvlc.dll作一個簡單的播放器? ?????(libvlc_drawable_t)this->GetDlgItem(IDC_DISPLAY)->GetSafeHwnd();
利用MFC調用libvlc.dll作一個簡單的播放器? ?libvlc_media_player_set_drawable(p_media_player, hwnd,&ex);
利用MFC調用libvlc.dll作一個簡單的播放器? ?libvlc_media_player_play(p_media_player,&ex);
利用MFC調用libvlc.dll作一個簡單的播放器}



? ? 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中注釋掉:
利用MFC調用libvlc.dll作一個簡單的播放器#ifndef __intptr_t_defined
利用MFC調用libvlc.dll作一個簡單的播放器#define __intptr_t_defined
利用MFC調用libvlc.dll作一個簡單的播放器//typedef longintptr_t;
利用MFC調用libvlc.dll作一個簡單的播放器#endif
利用MFC調用libvlc.dll作一個簡單的播放器//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目錄下就可以編譯執行。需要的自己下載添加調試。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447197.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447197.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447197.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

對于以太坊虛擬機 (EVM)及其相關知識的講解

以太坊虛擬機&#xff08;EVM&#xff09; EVM是智能合約的運行環境作為區塊驗證協議的一部分&#xff0c;參與網絡的每個節點都會運行EVM&#xff0c;審查節點會檢查驗證正在驗證的區塊中列出的交易&#xff0c;并運行EVM中交易觸發的代碼EVM是沙盒封裝的&#xff0c;并且是完…

對于以太坊的Solidity語言介紹

Solidity是什么 Solidity是一門面向合約的、為實現智能合約而創建的高級編程語言&#xff0c;主要目的是為了在以太坊虛擬機&#xff08;EVM&#xff09;上運行Solidity是靜態語言&#xff0c;支持繼承、庫和復雜的用戶定義等特性內含的類型除了常見的編程語言中的標準類型&am…

live555 接收rtsp視頻流流程分析

live555 接收rtsp視頻流流程分析 RTSP交互流程 C表示RTSP客戶端&#xff0c;S表示RTSP服務端 ① C->S: OPTIONrequest //詢問S有哪些方法可用 S->C: OPTION response //S回應信息中包括提供的所有可用方法 ② C->S: DESCRIBErequest //要求得到S…

使用Remix編寫Solidity語言的小例子

設置數值/取數值/加法運算 講解 uint默認使用256位數的整型view表示這個函數僅僅對于數據僅僅是讀取&#xff0c;沒有修改操作returns(uint )&#xff0c;如果單純指定uint&#xff0c;返回的是函數體內的return值&#xff0c;如果包含uint sum,uint SAD_a&#xff0c;那么返…

RTP協議棧簡介

流媒體指的是在網絡中使用流技術傳輸的連續時基媒體&#xff0c;其特點是在播放前不需要下載整個文件&#xff0c;而是采用邊下載邊播放的方式&#xff0c;它是視頻會議、IP電話等應用場合的技術基礎。RTP是進行實時流媒體傳輸的標準協議和關鍵技術&#xff0c;本文介紹如何在L…

深入理解Solidity

Solidity源文件布局 pragma&#xff08;版本雜注&#xff09; 用于指定源文件的版本&#xff0c;表明編譯器的版本&#xff0c;例如 pragma solidity ^0.4.0^用于指代版本號需要大于0.4.0但是不可以超過大的層級&#xff0c;必須小于0.5.0也可以使用大于等于小于來指定版本 i…

H264 流媒體 編碼匯總

實時傳輸協議&#xff08;RTP&#xff09;和實時控制協議&#xff08;RTCP&#xff09; RTP是一種提供端對端傳輸服務的實時傳輸協議&#xff0c;用來支持在單目標廣播和多目標廣播網絡服務中傳輸實時數據&#xff0c;而實時數據的傳輸則由RTCP協議來監視和控制。 RTP定義在RFC…

使用多線程的方式調用chineseocr_API

ChineseOCR在線API 網頁鏈接 界面 提供多種接口調用方式&#xff0c;比如在線調用、Javascript api調用、curl api調用和python api調用四種方式&#xff0c;本次使用javascript api調用的方式進行OCR識別代碼 import glob import base64 import os import requests import …

開源好代碼 音視頻

VirtualDub 一、簡介 圖1VirtualDub主界面 VirtualDub是一款開源的音視頻捕獲、處理軟件。VirtualDub也可稱為一款多媒體編輯軟件&#xff0c;因為它包含了多媒體輸入、編輯、處理、輸出等各個環節&#xff0c;但是作者并未將它定位為一款多媒體編輯軟件&#xff08;參見官網&a…

MAC對于Excel表格換行操作

按住option之后&#xff0c;點擊Enter就可以完成換行操作

深入理解Solidity 二

Solidity數據位置 所有復雜的數據類型&#xff0c;即數組、結構和映射類型&#xff0c;都會有一個額外屬性“數據位置”&#xff0c;用來指定數據的存儲位置&#xff0c;即數據是存儲在memory還是存儲在storage里面根據上下文環境&#xff0c;IDE會自動指定數據的默認存儲位置…

VOIP簡介

一、什么是VOIP VOIP全稱為&#xff08;VoiceOver Internet Protocol&#xff09;&#xff0c;是一種利用Internet網絡進行語音通信的技術&#xff0c;更通俗一點說&#xff0c;就是IP電話。就是以IP分組交換網為傳輸平臺&#xff0c;對模擬的語音信號進行編碼壓縮&#xff0c…

深入理解Solidity 三

Solidity函數聲明和類型 函數的值類型有兩類&#xff1a;內部&#xff08;internal&#xff09;類型和外部&#xff08;external&#xff09;類型內部函數只可以在當前合約內部被調用&#xff08;即在當前代碼塊內&#xff0c;包括內部庫函數和繼承函數&#xff09;&#xff0c…

HTTP狀態代碼及其定義

狀態行包含HTTP版本、狀態代碼、與狀態代碼對應的簡短說明信息。在大多數情況下&#xff0c;除了Content-Type之外的所有應答頭都是可選的。但Content-Type是必需的&#xff0c;它描述的是后面文檔的MIME類型。雖然大多數應答都包含一個文檔&#xff0c;但也有一些不包含&#…

安裝solc模塊4.25版本

使用國產阿里云的cnpm 如果不知道cnpm 參考鏈接 安裝solc模塊4.25版本 npm i solc0.4.25 --save -g查看安裝是否成功 可以配置軟連接使用solc&#xff0c;我的沒有配置 solcjs --version

conda關鍵命令

創建環境 創建名字為python3的虛擬環境&#xff0c;并且指定conda的python版本為3.6--name也可以縮寫為-namepython3.6 是指定python的版本號,如果不指定就默認為裝anaconda時python版本python3是創建的新的虛擬環境的名字&#xff0c;創建完&#xff0c;虛擬環境安裝在anacon…

GDB 調試程序 詳解 使用實例

用GDB調試程序 GDB概述 ———— GDB是GNU開源組織發布的一個強大的UNIX下的程序調試工具。或許&#xff0c;各位比較喜歡那種圖形界面方式的&#xff0c;像VC、BCB等IDE的調試&#xff0c;但如果你是在UNIX平臺下做軟件&#xff0c;你會發現GDB這個調試工具有比VC、BCB的圖形化…

在pycharm中使用conda虛擬環境(conda虛擬環境是已經創建好的),解決python安裝包文件很費勁的問題

查看conda的虛擬環境 使用PyCharm連接conda創建的虛擬環境&#xff0c;需要一個前提就是虛擬環境必須存在&#xff0c;使用conda env list命令查看虛擬環境列表打開PyCharm軟件 打開pycharm&#xff0c;選擇File->setting->Project:****->Project Interperter&#…

YUV測試序列下載地址

1、http://www.tkn.tu-berlin.de/research/vid/&#xff08;此網站已經移走&#xff0c;正在尋找。&#xff09; CIF&#xff1a; Akiyo、Bridge (far) 、Bridge (close) 、Bus 、Container 、Coastguard 、Flower 、Football 、Foreman 、Hall 、Highway 、Mobile & Calen…

flask 安裝flask_resultful

命令如下 conda install -c https://conda.anaconda.org/conda-forge flask-restful