亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于DirectShow技術(shù)的媒體播放器

        2008-07-14 10:05:50秦曉梅張藝博
        電腦知識(shí)與技術(shù) 2008年18期

        秦曉梅 張藝博

        摘要:介紹了DirectShow技術(shù)的基本概念和Filter Graph及其組成,提出了一個(gè)基于DirectShow技術(shù)的媒體播放器的設(shè)計(jì),并構(gòu)建了過(guò)濾器圖表,同時(shí)文中詳細(xì)敘述了軟件開(kāi)發(fā)的實(shí)現(xiàn)框架。本文以VC + + 6.0和DirectShow技術(shù)開(kāi)發(fā)媒體播放器,并給出了關(guān)鍵代碼的示例。

        關(guān)鍵詞:DirecShow;Filter;Filter Graph;媒體播放器

        中圖分類號(hào):TP37文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)18-2pppp-0c

        Media Player Based on DirectShow Technology

        QIN Xiao-mei, ZHANG Yi-bo

        (Henan Economy and Trade Vocational College,Zhenzhou 450053,China)

        Abstract: This thesis mainly introduces the basic concept of DirectShow technology, and Filter Graph with its composition, the thesis suggests a media player based on DirectShow technology one, and designs filter graph. The realization frame of software development is discussed at the same time detailedly in the main body of this thesis. VC + + 6.0 and DirectShow technology is used in the course of programming. the key code of the program is also available.

        Key words:DirecShow;Filter;Filter Graph;Media Player

        1 引言

        DirectX軟件開(kāi)發(fā)包是微軟公司提供的一套在Windows平臺(tái)上開(kāi)發(fā)高性能圖形、聲音、輸入輸出和網(wǎng)絡(luò)游戲的編程接口,DirectShow是DirectX家族的成員之一,DirectShow可以實(shí)現(xiàn)高質(zhì)量的音視頻采集、編輯、編碼、解碼和播放。DirectShow是基于COM 的,它為程序人員從Windows平臺(tái)上音視頻信息的網(wǎng)絡(luò)傳輸、硬件差異、同步性中解脫出來(lái),軟件開(kāi)發(fā)者只要按照DirectShow COM接口來(lái)編寫程序,不用關(guān)心硬件設(shè)備、不同媒體格式的差別、編解碼的實(shí)現(xiàn)細(xì)節(jié)等,極大地降低了多媒體應(yīng)用程序開(kāi)發(fā)的復(fù)雜度,目前DirectShow在多媒體應(yīng)用中發(fā)揮著重要作用。

        2 DirectShow概述

        DirectShow是一個(gè)開(kāi)放的應(yīng)用框架,是一套基于COM的編程接口。圖 1是DirectShow的系統(tǒng)功能。圖中最大的一塊就是DireceShow系統(tǒng),它的基本工作原理就是流水線:將Filter串聯(lián)在一起,交由Filter Graph Manager統(tǒng)一管理。系統(tǒng)的輸入為文件、硬件板塊、網(wǎng)絡(luò)數(shù)據(jù)等,系統(tǒng)的輸出為聲卡、顯卡、本地文件系統(tǒng)、網(wǎng)絡(luò)。

        圖1 DiretShow系統(tǒng)

        3 Filter Graph及其組成

        3.1 DirectShow的Filter

        DirectShow是基于模塊化,每個(gè)功能模塊都采取COM組件方式,稱為Filter。DirectShow提供了一系列標(biāo)準(zhǔn)的模塊用于應(yīng)用開(kāi)發(fā),開(kāi)發(fā)者也可以開(kāi)發(fā)自己的Filter來(lái)擴(kuò)展DirectShow的應(yīng)用。下面我們用一個(gè)例子來(lái)說(shuō)明如何采取Filter來(lái)播放一個(gè)AVI的視頻文件。從文件讀取數(shù)據(jù),形成字節(jié)流(這個(gè)工作由源Filter完成),檢查AVI數(shù)據(jù)流的頭格式,然后通過(guò)AVI分割Filter將音視頻流分開(kāi)。根據(jù)壓縮格式的不同,選取不同的Decoder Filters解碼視頻流,重畫視頻圖像。通過(guò)Renderer Filter將音頻流送到聲卡進(jìn)行播放,一般采用缺省的 DirectSound Device Filter。流程見(jiàn)下圖 2。

        圖2 AVI文件播放流程

        從圖 2看,每一個(gè)Filter 都和其他的一個(gè)或者兩個(gè)Filter 相連接,連接點(diǎn)也是COM對(duì)象,稱為Pin。Filter通過(guò)Pin將數(shù)據(jù)從一個(gè)Filter傳遞到另一個(gè)Filter,從而可以使數(shù)據(jù)在Filter的鏈表中流動(dòng)。

        3.2 Filter Graph Manager

        Filter Graph Manager是一個(gè)COM對(duì)象,用來(lái)控制Filter Graph中的所有的Filter,主要有以下的功能:

        (1)用來(lái)協(xié)調(diào)Filter之間的狀態(tài)改變,從而使Graph中的所有的Filter的狀態(tài)的改變應(yīng)該一致。Graph中的Filter的狀態(tài)改變應(yīng)該一致,應(yīng)用程序并不將狀態(tài)改變的命令直接發(fā)給Filter,而是將相應(yīng)的狀態(tài)改變的命令發(fā)送給Filter Graph Manager,由manager將命令分發(fā)給Graph中每一個(gè)Filter。

        (2)建立一個(gè)參考時(shí)鐘。Graph中的Filter都采用同一個(gè)時(shí)鐘,稱為參考時(shí)鐘(reference clock),參考時(shí)鐘可以確保所有的數(shù)據(jù)流同步。Filter Graph Manager應(yīng)該選擇一個(gè)參考時(shí)鐘,可以選擇聲卡上的時(shí)鐘,也可以選擇系統(tǒng)時(shí)鐘。

        (3)將Filter的消息返回給應(yīng)用程序。Graph管理器采用事件機(jī)制將Graph中發(fā)生的事件通知給應(yīng)用程序,這個(gè)機(jī)制類似于windows消息循環(huán)機(jī)制。

        (4)提供方法建立Filter Graph。Graph管理器給應(yīng)用程序提供了將Filter添加進(jìn)Graph的方法,連接Filter的方法,斷開(kāi)Filter連接的方法。

        3.3 媒體類型

        DirectShow需要一種方式來(lái)描述Filter Graph每一個(gè)點(diǎn)的數(shù)據(jù)格式,例如,我們還以播放AVI文件為例,數(shù)據(jù)以RIFF塊的形式進(jìn)入Graph中,然后被分割成視頻和音頻流,視頻流有一系列的壓縮的視頻幀組成,解壓后視頻流由一系列的無(wú)壓縮的位圖組成,音頻流也要走同樣的步驟。

        3.4 硬件在Graph中的作用

        為了提高系統(tǒng)的穩(wěn)定性,Windows操作系統(tǒng)對(duì)硬件操作進(jìn)行了隔離。DirectShow包裝Filter,這種Filter能工作在用戶模式下,外觀、控制方法跟普通Filter 一樣,而包裝Filter內(nèi)部完成與硬件驅(qū)動(dòng)程序的交互。使得編寫DirectShow應(yīng)用程序從支持硬件而做出的特殊處理中解脫出來(lái)。

        4 基于DirectShow技術(shù)的媒體播放器

        4.1 配置開(kāi)發(fā)環(huán)境

        本媒體播放器(MyPlayer)使用VC++6.0開(kāi)發(fā),采用DirectX SDK9.0編程接口。DirectX SDK安裝在C: DX90SDK目錄下。軟件開(kāi)發(fā)之前必須先完成以下準(zhǔn)備工作。

        (1)編譯基類源代碼,用VC打開(kāi)C:DX90SDKSamplesC++DirectShow

        BaseClassesaseclass.dsw,編譯生成兩個(gè)靜態(tài)庫(kù)文件:Debug版本生成strmbasd.lib,Release版本生成strmbase.lib。

        (2)配置VC的編譯環(huán)境:Include目錄和Lib目錄分別添加以下內(nèi)容:

        C:DX90SDKINCLUDE

        C:DX90SDKSAMPLESC++DIRECTSHOWBASECLASSES

        C:DX90SDKSAMPLESC++COMMON

        C:DX90SDKLIB

        C:DX90SDKSAMPLESC++DIRECTSHOWBASECLASSESDebug

        C:DX90SDKSAMPLESC++DIRECTSHOWBASECLASSESRelease

        (3)配置DirectShow應(yīng)用程序開(kāi)發(fā)項(xiàng)目需要連接的庫(kù)文件。執(zhí)行VC的菜單命令Project|Setttings,在彈出的對(duì)話框中單擊Link標(biāo)簽,在Object/library modules文本框中,Debug版本輸入strmbasd.lib Winmm.lib,Release版本輸入strmbase.lib Winmm.lib。

        4.2 功能設(shè)計(jì)

        主要功能包括:播放、暫停、停止、快放、慢放、全屏播放。MyPlayer是在C:DX90SDKSamplesC++DirectShowPlayerPlayWnd基礎(chǔ)上修改完成的。程序界面如圖 3。

        圖3 程序界面

        MyPlayer是一個(gè)標(biāo)準(zhǔn)的Win32應(yīng)用程序。程序入口函數(shù)為WinMain,總的執(zhí)行流程如下:CoInitializeEx|創(chuàng)建主窗口|發(fā)送消息彈出一個(gè)對(duì)話框以選擇要播放的媒體文件|主線程的消息循環(huán)|CoUninitialize。主線程的消息循環(huán)中完成:播放、暫停、停止、全屏、快放、慢放等。

        (1)播放功能實(shí)現(xiàn)方法為:選擇媒體文件、初始化程序窗口、初始化視頻播放窗口、調(diào)用HRESULT PlayMovieInWindow(LPTSTR szFile)函數(shù)完成播放。PlayMovieInWindow函數(shù)主要實(shí)現(xiàn)代碼和功能如下:

        1)創(chuàng)建一個(gè)Filter Graph組件CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGB);

        2)智能連接構(gòu)建Filter Graph組件pGB->RenderFile(wFile, NULL);

        3)獲取Filter Graph的各個(gè)控制接口

        //得到播放器控制接口、定位接口等

        pGB->QueryInterface(IID_IMediaControl, (void **)&pMC);

        pGB->QueryInterface(IID_IMediaEventEx, (void **)&pME);

        pGB->QueryInterface(IID_IMediaSeeking, (void **)&pMS);

        pGB->QueryInterface(IID_IMediaPosition, (void **)&pMP);

        // 得到視頻相關(guān)接口

        pGB->QueryInterface(IID_IVideoWindow, (void **)&pVW);

        pGB->QueryInterface(IID_IBasicVideo, (void **)&pBV);

        // 得到音頻相關(guān)接口

        pGB->QueryInterface(IID_IBasicAudio, (void **)&pBA);

        //完成其他窗口的初始化

        UpdateWindow(ghApp);

        4)播放Filter Graph

        pMC->Run();

        5)更新當(dāng)前狀態(tài)

        g_psCurrent=Running;

        SetFocus(ghApp);

        (2)暫停和停止功能實(shí)現(xiàn)為pMC->Pause();pMC->Stop();

        (3)全屏功能實(shí)現(xiàn)為pVW->put_FullScreenMode(OATRUE);

        (4)快放和慢放pMP->put_Rate(dNewRate);

        5 結(jié)束語(yǔ)

        本文簡(jiǎn)要介紹了DirectShow技術(shù)的基本概念和基于DirectShow技術(shù)的媒體播放器,并用VC++6.0實(shí)現(xiàn)。DirectShow提供的良好開(kāi)發(fā)環(huán)境,使得媒體播放器開(kāi)發(fā)實(shí)現(xiàn)比較方便,并且具有廣泛的通用性和可擴(kuò)展性。

        參考文獻(xiàn):

        [1]智慧的魚.DirectShow SDK學(xué)習(xí)筆記[EB/OL].http://www.chinavideo.org.

        [2]陸其明.DirectShow發(fā)指南[M].北京:清華大學(xué)出版社,2004.

        [3]陸其明.DirectShow實(shí)務(wù)精選[M].北京:科海電子出版社,2004.

        收稿日期:2008-04-02

        作者簡(jiǎn)介:秦曉梅(1980-),女,河南鄭州人,助教,華中科技大學(xué)在讀碩士,研究方向:數(shù)據(jù)庫(kù)技術(shù)、多媒體技術(shù)、軟件工程;張藝博(1973-),男,河南三門峽人,講師,華中科技大學(xué)碩士,研究方向:計(jì)算機(jī)信息安全,軟件工程和程序設(shè)計(jì)方向。

        两个黑人大战嫩白金发美女| 99偷拍视频精品一区二区| 国产熟女露脸大叫高潮| 成人做爰69片免费看网站| 97视频在线观看免费| 无码午夜人妻一区二区三区不卡视频 | 一区二区三区少妇熟女高潮| 成年女人18毛片观看| 玖玖资源站亚洲最大的网站| 日本精品一区二区三区福利视频| av中文字幕潮喷人妻系列| 亚洲精品黑牛一区二区三区| 国产精品一区二区电影| 亚洲中文字幕久爱亚洲伊人| 精品国产一品二品三品| 国产夫妻精品自拍视频| 狠狠综合久久av一区二区蜜桃| 欧美最大胆的西西人体44| 男女18禁啪啪无遮挡| 精品亚洲国产探花在线播放 | 最近中文av字幕在线中文 | 公与淑婷厨房猛烈进出| 成人免费无码大片a毛片软件| 99国产超薄丝袜足j在线观看| 日韩AV无码中文无码AV| 日韩亚洲在线一区二区| 国产在线观看午夜视频| 久久久久久久亚洲av无码| 久无码久无码av无码| 中文字幕无码专区一VA亚洲V专| 亚洲一区二区三区ay| 国产女主播一区二区久久| 一色桃子中文字幕人妻熟女作品| 中国人妻被两个老外三p| 欧美日韩在线观看免费| 99久久国语露脸国产精品| 韩国女主播一区二区三区在线观看 | 挑战亚洲美女视频网站| 国产一区二区三区小向美奈子 | 亚洲精品成人无百码中文毛片| 国产精品精品自在线拍|