一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Visual C#使用DirectX實(shí)現(xiàn)視頻播放

 賢人好客 2010-09-18
很多人第一次接觸到DirectX大都是通過游戲,至于安裝、升級(jí)DirectX的原因無非是滿足游戲運(yùn)行的需要。Direct X其實(shí)是微軟公司推出的一個(gè)為Windows平臺(tái)的多媒體API函數(shù)庫(kù),它提供標(biāo)準(zhǔn)接口來與顯卡和聲卡、輸入設(shè)備等進(jìn)行交互。如果沒有這組標(biāo)準(zhǔn)API函數(shù)庫(kù),那你就需要為每一種顯卡、聲卡的每個(gè)組合和每種類型的鍵盤、鼠標(biāo)和游戲桿編寫不同的代碼。這不又回到了以前的Dos時(shí)代。為了解決這個(gè)問題,微軟公司推出了DirectX。DirectX從具體的硬件中抽象出來,并且將一組通用指令轉(zhuǎn)換成硬件的具體命令。這樣開發(fā)語言通過調(diào)用統(tǒng)一標(biāo)準(zhǔn)的Direct X函數(shù)庫(kù)就可以操作每一種顯卡、聲卡的每個(gè)組合和每種類型的鍵盤、鼠標(biāo)和游戲桿等多媒體了。

  一.Direct X SDK 9.0安裝及類庫(kù)介紹:

  .Net FrameWork SDK中并沒有包含Direct X SDK,所以為了順利的完成本文后面介紹,
必須先下載、安裝Direct X SDK。具體的下載地址為:http://download.microsoft.com/download/a/c/d/acdfb557-266f-4af4-8673-6ab8009b4ddd/dxsdk_apr2005.exe。此版本是2005四月份推出的英文版。這并不妨礙下面的程序?qū)崿F(xiàn)。安裝完Direct X后,就會(huì)在存在"C:\WINDOWS\Microsoft.NET\Managed DirectX"這樣一個(gè)目錄,此目錄中目錄中應(yīng)該有九個(gè)DLL文件和九個(gè)XML文件。九個(gè)DLL文件大致對(duì)應(yīng)于DirectX中的十個(gè)命名空間。編程中就是使用其中的命名空間來提供對(duì)輸入設(shè)備、聲音、網(wǎng)絡(luò)播放、圖形等的支持。Direct X SDK 9.0中的定義的命名空間及其主要的作用具體如表01所示:

命名空間 描述 Microsoft.DirectX 公共類和數(shù)學(xué)結(jié)構(gòu) Microsoft.DirectX.Direct3D 3D圖形和助手庫(kù) Microsoft.DirectX.DirectDraw Direct Draw 圖形API。這是舊式命名空間,現(xiàn)在已經(jīng)不需要使用它。 Microsoft.DirectX.DirectPlay 用于多玩家游戲的網(wǎng)絡(luò)API Microsoft.DirectX.DirectSound 聲音支持 Microsoft.DirectX.DirectInput 輸入設(shè)備支持(例如,鼠標(biāo)和游戲桿) Microsoft.DirectX.AudioVideoPlayback 播放視頻和音頻(例如,在電腦上播放各自視頻動(dòng)畫文件) Microsoft.DirectX.Diagnostics 疑難解答 Microsoft.DirectX.Security 訪問安全性 Microsoft.DirectX.Security.Permissions 訪問安全權(quán)限       表01:Direct X SDK9.0中的定義的命名空間及其主要的作用

  Direct X內(nèi)容十分豐富,下文介紹的只是其中的一個(gè)小的應(yīng)用,即用Visual C#調(diào)用Direct X中的SDK來播放視頻文件為例子,程序中只使用了命名空間"Microsoft.DirectX.AudioVideoPlayback"。 Microsoft.DirectX.AudioVideoPlayback命名空間中定義了三個(gè)類:"Audio"、"Video"和"TextureRenderEventArgs"。其中前二個(gè)類是最常用的,分別用來支持音頻和視頻。Microsoft.DirectX.AudioVideoPlayback命名空間中定義的常用屬性及其具體的作用可參閱表02所示:

屬性 描述 Audio 獲取視頻文件中的音頻對(duì)象,可用來后續(xù)的音頻播放 Caption 獲取或設(shè)置在Form上播放視頻的名稱 CurrentPosition 獲取或設(shè)置播放視頻的當(dāng)前位置 DefaultSize 獲取播放視頻的缺省的視頻大小 Fullscreen 獲取或設(shè)置視頻文件是否在全屏模式下播放 IsCursorHidden 獲取播放的視頻時(shí)鼠標(biāo)的狀態(tài):隱藏或顯示 Owner 獲取或設(shè)置視頻播放的宿主組件 Paused 獲取當(dāng)前的播放狀態(tài)是否處于暫停狀態(tài) Playing 獲取當(dāng)前的播放狀態(tài)是否處于播放狀態(tài). SeekingCaps 獲取是否可以搜索性能 Size Retrieves and sets the size of the video for playback. State 獲取當(dāng)前的播放狀態(tài) Stopped 獲取當(dāng)前的播放狀態(tài)是否處于停止?fàn)顟B(tài) StopPosition 獲取播放的視頻的停止播放位置    表02:Microsoft.DirectX.AudioVideoPlayback命名空間中定義的常用屬性及其具體的作用

  Microsoft.DirectX.AudioVideoPlayback命名空間中定義的常用方法及其具體的作用可參閱表03所示:

方法 描述 HideCursor 隱藏當(dāng)前播放視頻的鼠標(biāo) Open 裝入新的文件到Video對(duì)象中 Pause 設(shè)置為暫停播放狀態(tài). Play 設(shè)置為播放狀態(tài) SeekCurrentPosition 搜索轉(zhuǎn)入到制定的播放位置 SeekStopPosition 設(shè)置一個(gè)新的停止位置 ShowCursor 顯示當(dāng)前播放視頻的鼠標(biāo) Stop 設(shè)置為停止播放狀態(tài) Video 初始化一個(gè)新的Video實(shí)例    表03:Microsoft.DirectX.AudioVideoPlayback命名空間中定義的常用屬性及其具體的作用

  了解了以上這些基礎(chǔ)知識(shí)后,下面就開始介紹Visual C#調(diào)用Direct X播放視頻文件的具體實(shí)現(xiàn)方法。

  二.本文章的程序設(shè)計(jì)、調(diào)試和運(yùn)行的環(huán)境:

 ?。?).微軟公司視窗2003中文企業(yè)版。

 ?。?).Visual Studio .Net 2003企業(yè)構(gòu)建版,.Net FrameWork SDK 1.1版本號(hào)4322。

  三.Visual C#使用Direct X的實(shí)現(xiàn)視頻播放


  Visual C#使用Direct X的實(shí)現(xiàn)視頻播放難點(diǎn)無非以下幾點(diǎn):

  1. 掌握在Visual C#引入Dirext X函數(shù)庫(kù)的方法。

  2. 設(shè)置Direct X視頻播放的宿主組件。

  3. 基本的播放命令的設(shè)置:播放、停止、暫停等。

  下面就是Visual C#使用Direct X的實(shí)現(xiàn)視頻播放具體實(shí)現(xiàn)步驟:

  1. 啟動(dòng)Visual Studio .Net。

  2. 選擇菜單【文件】|【新建】|【項(xiàng)目】后,彈出【新建項(xiàng)目】對(duì)話框。

  3. 將【項(xiàng)目類型】設(shè)置為【Visual C#項(xiàng)目】。

  4. 將【模板】設(shè)置為【W(wǎng)indows應(yīng)用程序】。

  5. 在【名稱】文本框中輸入【Visual C#中使用DriectX實(shí)現(xiàn)媒體播放】。

  6. 在【位置】的文本框中輸入【E:\VS.NET項(xiàng)目】,然后單擊【確定】按鈕。這樣在"E:\VS.NET項(xiàng)目"目錄中就創(chuàng)建了一個(gè)名稱為"Visual C#中使用DriectX實(shí)現(xiàn)媒體播放"的文件夾,里面存放的就是"Visual C#中使用DriectX實(shí)現(xiàn)媒體播放"項(xiàng)目的所有文件。

  7. 選中【解決方案管理器】|【引用】,單擊鼠標(biāo)右鍵,選中【添加引用】菜單,具體如圖01所示:


圖01:添加引用

  8. 選中【添加引用】菜單后,彈出【添加引用】對(duì)話框,按照?qǐng)D02所示,在【選定的組件】欄目中加入"Microsoft.DirectX.AudioVideoPlayback"后,單擊【確定】按鈕,則引用"Microsoft.DirectX.AudioVideoPlayback"文件成功。這是因?yàn)閂isual Studio .Net的缺省編譯環(huán)境中沒有"Microsoft.DirectX.AudioVideoPlayback.dll"文件,而程序中卻使用到"Microsoft.DirectX.AudioVideoPlayback"命名空間,所以要在編譯環(huán)境中引用"Microsoft.DirectX.AudioVideoPlayback"所在的文件。


  9. 把Visual Studio .Net的當(dāng)前窗口切換到【Form1.cs(設(shè)計(jì))】窗口,并從【工具箱】中的【W(wǎng)indows窗體組件】選項(xiàng)卡中往設(shè)計(jì)窗體中拖入下列組件,并執(zhí)行相應(yīng)操作:

  一個(gè)OpenFileDialog組件,用于選擇播放的視頻;一個(gè)panel組件,作為視頻播放的宿主組件;四個(gè)Button按鈕,分別執(zhí)行視頻打開、播放、暫停和停止操作。并在這四個(gè)組件拖入設(shè)計(jì)窗口后分別雙擊它們,則系統(tǒng)會(huì)在Form1.cs中分別產(chǎn)生這四個(gè)組件Click事件對(duì)應(yīng)的處理代碼。

  10. 把Visual Studio .Net的當(dāng)前窗口切換到Form1.cs的代碼編輯窗口,在Form1.cs的首部的引入命名空間的代碼區(qū)中,用下列代碼替換Form1.cs中由系統(tǒng)自動(dòng)產(chǎn)生的引入命名空間代碼:

using System ;
using System.Drawing ;
using System.Collections ;
using System.ComponentModel ;
using System.Windows.Forms ;
using System.Data ;
using Microsoft.DirectX.AudioVideoPlayback ;
//引入視頻播放所要使用的Direct X命名空間

  11. 在Form1.cs的class的代碼區(qū)中添加下列代碼,下列代碼是創(chuàng)建全局使用的Video實(shí)例:

private Video MyVideo = null ;
//創(chuàng)建一個(gè)Video實(shí)例

  12. 以下面代碼替代系統(tǒng)產(chǎn)生的InitializeComponent過程。下面代碼是對(duì)加入窗體的組件以及創(chuàng)建的全局變量進(jìn)行初始化和定義四個(gè)Button組件的Click事件和Form1的Load事件:

private void InitializeComponent ( )
{
 this.panel1 = new System.Windows.Forms.Panel ( ) ;
 this.button1 = new System.Windows.Forms.Button ( ) ;
 this.button2 = new System.Windows.Forms.Button ( ) ;
 this.button3 = new System.Windows.Forms.Button ( ) ;
 this.button4 = new System.Windows.Forms.Button ( ) ;
 this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog ( ) ;
 this.SuspendLayout ( ) ;
 this.panel1.Dock = System.Windows.Forms.DockStyle.Top ;
 this.panel1.Location = new System.Drawing.Point ( 0, 0 ) ;
 this.panel1.Name = "panel1" ;
 this.panel1.Size = new System.Drawing.Size ( 540, 346 ) ;
 this.panel1.TabIndex = 0 ;
 this.button1.Location = new System.Drawing.Point ( 62, 380 ) ;
 this.button1.Name = "button1" ;
 this.button1.Size = new System.Drawing.Size ( 80, 38 ) ;
 this.button1.TabIndex = 1 ;
 this.button1.Text = "打開" ;
 this.button1.Click += new System.EventHandler ( this.button1_Click ) ;
 this.button2.Location = new System.Drawing.Point ( 165, 380 ) ;
 this.button2.Name = "button2" ;
 this.button2.Size = new System.Drawing.Size ( 81, 38 ) ;
 this.button2.TabIndex = 1 ;
 this.button2.Text = "播放" ;
 this.button2.Click += new System.EventHandler ( this.button2_Click ) ;
 this.button3.Location = new System.Drawing.Point ( 268, 380 ) ;
 this.button3.Name = "button3" ;
 this.button3.Size = new System.Drawing.Size ( 80, 38 ) ;
 this.button3.TabIndex = 1 ;
 this.button3.Text = "暫停" ;
 this.button3.Click += new System.EventHandler ( this.button3_Click ) ;
 this.button4.Location = new System.Drawing.Point ( 371, 380 ) ;
 this.button4.Name = "button4" ;
 this.button4.Size = new System.Drawing.Size ( 81, 38 ) ;
 this.button4.TabIndex = 1 ;
 this.button4.Text = "停止" ;
 this.button4.Click += new System.EventHandler ( this.button4_Click ) ;
 this.openFileDialog1.DefaultExt = "avi" ;
 this.openFileDialog1.Filter = "視頻文件|*.avi||" ;
 this.openFileDialog1.Title = "請(qǐng)選擇播放的AVI文件" ;
 this.AutoScaleBaseSize = new System.Drawing.Size ( 6, 14 ) ;
 this.ClientSize = new System.Drawing.Size ( 540, 461 ) ;
 this.Controls.Add ( this.button1 ) ;
 this.Controls.Add ( this.panel1 ) ;
 this.Controls.Add ( this.button2 ) ;
 this.Controls.Add ( this.button3 ) ;
 this.Controls.Add ( this.button4 ) ;
 this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog ;
 this.MaximizeBox = false ;
 this.Name = "Form1" ;
 this.Text = "Visual C#中使用DriectX實(shí)現(xiàn)媒體播放" ;
 this.Load += new System.EventHandler ( this.Form1_Load ) ;
 this.ResumeLayout ( false ) ;
}

  至此【Visual C#中使用DriectX實(shí)現(xiàn)媒體播放】項(xiàng)目的界面設(shè)計(jì)和功能實(shí)現(xiàn)的前期工作就完成了,設(shè)計(jì)界面如圖03所示:


圖03:【Visual C#中使用DriectX實(shí)現(xiàn)媒體播放】項(xiàng)目的界面設(shè)計(jì)

 

  13. 用下列代碼替換Form1.cs中的button1組件的Click事件對(duì)應(yīng)的處理代碼,下列代碼的功能是打開選定的視頻文件,并在定義的Panel組件上顯示開始第一幀:

private void button1_Click ( object sender, System.EventArgs e )
{
 openFileDialog1.InitialDirectory = Application.StartupPath ;
 if ( openFileDialog1.ShowDialog ( ) == DialogResult.OK )
 {
  // 記錄panel組件的大小
  int height = panel1.Height ;
  int width = panel1.Width ;
  // 如果存在打開的Video文件,釋放它
  if ( MyVideo != null )
  {
   MyVideo.Dispose ( ) ;
  }
  // 打開一個(gè)新的Video文件
  MyVideo = new Video ( openFileDialog1.FileName ) ;
  // 把Video文件分配給創(chuàng)建的Panel組件
  MyVideo.Owner = panel1 ;
  // 以記錄的panel組件的大小來重新定義
  panel1.Width = width ;
  panel1.Height = height ;
  // 播放AVI文件的第一幀,主要是為了在panel中顯示
  MyVideo.Play ( ) ;
  MyVideo.Pause ( ) ;
 }
 //確定窗體中的各按鈕狀態(tài)
 if ( MyVideo == null )
 {
  button2.Enabled = false ;
  button3.Enabled = false ;
  button4.Enabled = false ;
 }
 else
 {
  button2.Enabled = true ;
  button3.Enabled = true ;
  button4.Enabled = true ;
 }
}

  14. 用下列代碼替換Form1.cs中的button2組件的Click事件對(duì)應(yīng)的處理代碼,下列代碼的功能播放當(dāng)前打開的視頻文件:

private void button2_Click ( object sender, System.EventArgs e )
{
 if ( MyVideo != null )
 {
  MyVideo.Play ( ) ;
 }
}

  15. 用下列代碼替換Form1.cs中的button3組件的Click事件對(duì)應(yīng)的處理代碼,下列代碼的功能暫停播放當(dāng)前打開的視頻文件:

private void button3_Click ( object sender, System.EventArgs e )
{
 if ( MyVideo != null )
 {
  MyVideo.Pause ( ) ;
 }
}

  16. 用下列代碼替換Form1.cs中的button4組件的Click事件對(duì)應(yīng)的處理代碼,下列代碼的功能停止播放當(dāng)前打開的視頻文件:

private void button4_Click ( object sender, System.EventArgs e )
{
 if ( MyVideo != null )
 {
  MyVideo.Stop ( ) ;
 }
}

  17. 在button4的Click事件之后,添加下列代碼,下列代碼的功能是初始化Form窗體中的button組件:
//初始化窗體中各按鈕的狀態(tài)
private void Form1_Load ( object sender, System.EventArgs e )
{
 if ( MyVideo == null )
 {
  button2.Enabled = false ;
  button3.Enabled = false ;
  button4.Enabled = false ;
 }
 else
 {
  button2.Enabled = true ;
  button3.Enabled = true ;
  button4.Enabled = true ;
 }
}

  18. 至此,在上述步驟都正確完成,并全部保存后,【Visual C#中使用DriectX實(shí)現(xiàn)媒體播放】項(xiàng)目的全部工作就完成了。此時(shí)單擊快捷鍵【F5】運(yùn)行程序后,圖04是播放視頻文件時(shí)得到的程序運(yùn)行界面:


圖04:【Visual C#中使用DriectX實(shí)現(xiàn)媒體播放】項(xiàng)目的運(yùn)行界面

  四.總結(jié):

  Direct X的出現(xiàn)的確解決了程序員的很多底層的工作,把面對(duì)各種煩雜硬件的工作交給了Direct X了。雖然Direct X從非托管版本發(fā)展到現(xiàn)在的托管版本,爭(zhēng)論一直存在,但越來越多的開發(fā)商把自己的軟件用托管的Direct X或者結(jié)合使用托管和非托管Direct X開發(fā),也從另外一個(gè)方面證明了托管的Direct X的生命力。本文結(jié)合一個(gè)示例具體介紹Visual C#調(diào)用非托管Direct X的方法實(shí)現(xiàn)視頻播放,這對(duì)于托管Direct X來說只是其中的一個(gè)小應(yīng)用。最后希望此篇文章對(duì)那些希望了解、掌握在Visual C#調(diào)用Direct X編寫游戲程序的朋友有所幫助。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    欧美欧美日韩综合一区| 中文字幕精品一区二区年下载| 欧美午夜视频免费观看| 精品国产一区二区欧美| 狠色婷婷久久一区二区三区| 亚洲欧美日韩熟女第一页| 亚洲专区一区中文字幕| 亚洲熟妇熟女久久精品 | 日韩精品第一区二区三区| 亚洲精品一二三区不卡| 日本高清不卡一二三区| 亚洲视频一级二级三级| 国产精品亚洲综合天堂夜夜| 欧美日韩亚洲精品内裤| 欧美黑人黄色一区二区| 亚洲国产香蕉视频在线观看| 亚洲精品中文字幕熟女| 国产高清一区二区白浆| 亚洲精品福利入口在线| 91日韩欧美国产视频| 久久这里只有精品中文字幕| 久久国产青偷人人妻潘金莲| 精品一区二区三区乱码中文| 亚洲中文在线中文字幕91| 亚洲综合精品天堂夜夜| 黑人粗大一区二区三区| 国产又粗又猛又爽又黄| 五月激情五月天综合网| 欧美日韩综合综合久久久| 欧美日韩国产成人高潮| 亚洲人午夜精品射精日韩| 美国欧洲日本韩国二本道| 亚洲国产av精品一区二区| 亚洲精品一区二区三区免| 色婷婷视频在线精品免费观看 | 亚洲欧美日韩国产综合在线| 黄色在线免费高清观看| 亚洲午夜精品视频观看| 国产精品自拍杆香蕉视频| 国产福利在线播放麻豆| 东京热电东京热一区二区三区 |