Visual C#使用DirectX實現視頻播放

來源:互聯網
上載者:User
visual|視頻播放

  很多人第一次接觸到DirectX大都是通過遊戲,至於安裝、升級DirectX的原因無非是滿足遊戲啟動並執行需要。Direct X其實是微軟公司推出的一個為Windows平台的多媒體API函數庫,它提供標準介面來與顯卡和音效卡、輸入裝置等進行互動。如果沒有這組標準API函數庫,那你就需要為每一種顯卡、音效卡的每個組合和每種類型的鍵盤、滑鼠和遊戲杆編寫不同的代碼。這不又回到了以前的Dos時代。為瞭解決這個問題,微軟公司推出了DirectX。DirectX從具體的硬體中抽象出來,並且將一組通用指令轉換成硬體的具體命令。這樣開發語言通過調用統一標準的Direct X函數庫就可以操作每一種顯卡、音效卡的每個組合和每種類型的鍵盤、滑鼠和遊戲杆等多媒體了。

  一.Direct X SDK 9.0安裝及類庫介紹:

  .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四月份推出的英文版。這並不妨礙下面的程式實現。安裝完Direct X後,就會在存在"C:\WINDOWS\Microsoft.NET\Managed DirectX"這樣一個目錄,此目錄中目錄中應該有九個DLL檔案和九個XML檔案。九個DLL檔案大致對應於DirectX中的十個命名空間。編程中就是使用其中的命名空間來提供對輸入裝置、聲音、網路播放、圖形等的支援。Direct X SDK 9.0中的定義的命名空間及其主要的作用具體如表01所示:

命名空間 描述
Microsoft.DirectX 公用類和數學結構
Microsoft.DirectX.Direct3D 3D圖形和助手庫
Microsoft.DirectX.DirectDraw Direct Draw 圖形API。這是舊式命名空間,現在已經不需要使用它。
Microsoft.DirectX.DirectPlay 用於多玩家遊戲的網路API
Microsoft.DirectX.DirectSound 聲音支援
Microsoft.DirectX.DirectInput 輸入裝置支援(例如,滑鼠和遊戲杆)
Microsoft.DirectX.AudioVideoPlayback 播放視頻和音頻(例如,在電腦上播放各自視頻動畫檔案)
Microsoft.DirectX.Diagnostics 疑難解答
Microsoft.DirectX.Security 訪問安全性
Microsoft.DirectX.Security.Permissions 訪問安全許可權

       表01:Direct X SDK9.0中的定義的命名空間及其主要的作用

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

屬性 描述
Audio 擷取視頻檔案中的音頻對象,可用來後續的音頻播放
Caption 擷取或設定在Form上播放視頻的名稱
CurrentPosition 擷取或設定播放視頻的當前位置
DefaultSize 擷取播放視頻的預設的視頻大小
Fullscreen 擷取或設定視頻檔案是否在全螢幕模式下播放
IsCursorHidden 擷取播放的視頻時滑鼠的狀態:隱藏或顯示
Owner 擷取或設定視頻播放的宿主組件
Paused 擷取當前的播放狀態是否處於暫停狀態
Playing 擷取當前的播放狀態是否處於播放狀態.
SeekingCaps 擷取是否可以搜尋效能
Size Retrieves and sets the size of the video for playback.
State 擷取當前的播放狀態
Stopped 擷取當前的播放狀態是否處於停止狀態
StopPosition 擷取播放的視頻的停止播放位置

    表02:Microsoft.DirectX.AudioVideoPlayback命名空間中定義的常用屬性及其具體的作用

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

方法 描述
HideCursor 隱藏當前播放視頻的滑鼠
Open 裝入新的檔案到Video對象中
Pause 設定為暫停播放狀態.
Play 設定為播放狀態
SeekCurrentPosition 搜尋轉入到制定的播放位置
SeekStopPosition 設定一個新的停止位置
ShowCursor 顯示當前播放視頻的滑鼠
Stop 設定為停止播放狀態
Video 初始化一個新的Video執行個體

    表03:Microsoft.DirectX.AudioVideoPlayback命名空間中定義的常用屬性及其具體的作用

  瞭解了以上這些基礎知識後,下面就開始介紹Visual C#調用Direct X播放視頻檔案的具體實現方法。

  二.本文章的程式設計、調試和啟動並執行環境:

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

  (2).Visual Studio .Net 2003企業構建版,.Net FrameWork SDK 1.1版本號碼4322。

  三.Visual C#使用Direct X的實現視頻播放


  Visual C#使用Direct X的實現視頻播放痛點無非以下幾點:

  1. 掌握在Visual C#引入Dirext X函數庫的方法。

  2. 設定Direct X視頻播放的宿主組件。

  3. 基本的播放命令的設定:播放、停止、暫停等。

  下面就是Visual C#使用Direct X的實現視頻播放具體實現步驟:

  1. 啟動Visual Studio .Net。

  2. 選擇菜單【檔案】|【建立】|【項目】後,彈出【建立項目】對話方塊。

  3. 將【項目類型】設定為【Visual C#項目】。

  4. 將【模板】設定為【Windows應用程式】。

  5. 在【名稱】文字框中輸入【Visual C#中使用DriectX實現媒體播放】。

  6. 在【位置】的文字框中輸入【E:\VS.NET項目】,然後單擊【確定】按鈕。這樣在"E:\VS.NET項目"目錄中就建立了一個名稱為"Visual C#中使用DriectX實現媒體播放"的檔案夾,裡面存放的就是"Visual C#中使用DriectX實現媒體播放"項目的所有檔案。

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


圖01:添加引用


  8. 選中【添加引用】菜單後,彈出【添加引用】對話方塊,按照圖02所示,在【選定的組件】欄目中加入"Microsoft.DirectX.AudioVideoPlayback"後,單擊【確定】按鈕,則引用"Microsoft.DirectX.AudioVideoPlayback"檔案成功。這是因為Visual Studio .Net的預設編譯環境中沒有"Microsoft.DirectX.AudioVideoPlayback.dll"檔案,而程式中卻使用到"Microsoft.DirectX.AudioVideoPlayback"命名空間,所以要在編譯環境中引用"Microsoft.DirectX.AudioVideoPlayback"所在的檔案。


  9. 把Visual Studio .Net的當前視窗切換到【Form1.cs(設計)】視窗,並從【工具箱】中的【Windows表單組件】選項卡中往設計表單中拖入下列組件,並執行相應操作:

  一個OpenFileDialog組件,用於選擇播放的視頻;一個panel組件,作為視頻播放的宿主組件;四個Button按鈕,分別執行視頻開啟、播放、暫停和停止操作。並在這四個組件拖入設計視窗後分別雙擊它們,則系統會在Form1.cs中分別產生這四個組件Click事件對應的處理代碼。

  10. 把Visual Studio .Net的當前視窗切換到Form1.cs的代碼編輯視窗,在Form1.cs的首部的引入命名空間的代碼區中,用下列代碼替換Form1.cs中由系統自動產生的引入命名空間代碼:

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的代碼區中添加下列代碼,下列代碼是建立全域使用的Video執行個體:

private Video MyVideo = null ;
//建立一個Video執行個體


  12. 以下面代碼替代系統產生的InitializeComponent過程。下面代碼是對加入表單的組件以及建立的全域變數進行初始化和定義四個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 = "請選擇播放的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實現媒體播放" ;
 this.Load += new System.EventHandler ( this.Form1_Load ) ;
 this.ResumeLayout ( false ) ;
}


  至此【Visual C#中使用DriectX實現媒體播放】項目的介面設計和功能實現的前期工作就完成了,設計介面如圖03所示:


圖03:【Visual C#中使用DriectX實現媒體播放】項目的介面設計

 13. 用下列代碼替換Form1.cs中的button1組件的Click事件對應的處理代碼,下列代碼的功能是開啟選定的視頻檔案,並在定義的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 ( ) ;
  }
  // 開啟一個新的Video檔案
  MyVideo = new Video ( openFileDialog1.FileName ) ;
  // 把Video檔案分配給建立的Panel組件
  MyVideo.Owner = panel1 ;
  // 以記錄的panel組件的大小來重新定義
  panel1.Width = width ;
  panel1.Height = height ;
  // 播放AVI檔案的第一幀,主要是為了在panel中顯示
  MyVideo.Play ( ) ;
  MyVideo.Pause ( ) ;
 }
 //確定表單中的各按鈕狀態
 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事件對應的處理代碼,下列代碼的功能播放當前開啟的視頻檔案:

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

  15. 用下列代碼替換Form1.cs中的button3組件的Click事件對應的處理代碼,下列代碼的功能暫停播放當前開啟的視頻檔案:

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

  16. 用下列代碼替換Form1.cs中的button4組件的Click事件對應的處理代碼,下列代碼的功能停止播放當前開啟的視頻檔案:

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

  17. 在button4的Click事件之後,添加下列代碼,下列代碼的功能是初始化Form表單中的button組件:

//初始化表單中各按鈕的狀態
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實現媒體播放】項目的全部工作就完成了。此時單擊快速鍵【F5】運行程式後,圖04是播放視頻檔案時得到的程式運行介面:


圖04:【Visual C#中使用DriectX實現媒體播放】項目的運行介面

   四.總結:

  Direct X的出現的確解決了程式員的很多底層的工作,把面對各種煩雜硬體的工作交給了Direct X了。雖然Direct X從非託管版本發展到現在的託管版本,爭論一直存在,但越來越多的開發商把自己的軟體用託管的Direct X或者結合使用託管和非託管Direct X開發,也從另外一個方面證明了託管的Direct X的生命力。本文結合一個樣本具體介紹Visual C#調用非託管Direct X的方法實現視頻播放,這對於託管Direct X來說只是其中的一個小應用。最後希望此篇文章對那些希望瞭解、掌握在Visual C#調用Direct X編寫遊戲程式的朋友有所協助。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.