DirectX里的Video和Audio C#的哦

原本是DX里的一个例子,我觉得还可以,就COPY出来,想改改看。结果让我大失所望。
最简单要求,就是对音频文件和视频文件可以定位查找,本来它的Video和Audio类都提供了Seek方法,但它们根本不能工作,每次Seek后,都回到0的位置上。后来用Reflector来看它的源代码,结果也是不尽人意,很多底层的代码没有办法反射出来。特别是DX里的一些接口,根本无法查看。最后也只好先暂停了。
本来还想着,要是DX在.Net下封装的比较好的话,我就可以少用C++的COM组件了,直接用C#来写组件也方便多了。没想到MS的托管DX确实还不够完善,我看可能要等以后的版本了。不过它的MediaPlay的SDK还是不错的,有机会也看看。

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.AudioVideoPlayback;

namespace Webb.DirectX.Debug2
{
    /** <summary>
    /// Summary description for Form1.
    /// </summary>
    public class AVPlayer : System.Windows.Forms.Form
    {

        private string filterText = "Video Files (*.avi; *.qt; *.mov; *.mpg; *.mpeg; *.m1v; *.wmv)|*.avi; *.qt; *.mov; *.mpg; *.mpeg; *.m1v; *.wmv|" +
            "Audio files (*.wav; *.mpa; *.mp2; *.mp3; *.au; *.aif; *.aiff; *.snd; *.wma)|*.wav; *.mpa; *.mp2; *.mp3; *.au; *.aif; *.aiff; *.snd; *.wma|" +
            "MIDI Files (*.mid, *.midi, *.rmi)|*.mid; *.midi; *.rmi|" +
            "Image Files (*.jpg, *.bmp, *.gif, *.tga)|*.jpg; *.bmp; *.gif; *.tga|" +
            "All Files (*.*)|*.*";

        private Video ourVideo = null;
        private Audio ourAudio = null;

        Winforms variables#region Winforms variables

        /** <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;
        private System.Windows.Forms.MainMenu mnuMain;
        private System.Windows.Forms.OpenFileDialog ofdOpen;
        private System.Windows.Forms.MenuItem menuItem3;
        private System.Windows.Forms.MenuItem mnuFile;
        private System.Windows.Forms.MenuItem mnuOpen;
        private System.Windows.Forms.MenuItem menuItem1;
        private System.Windows.Forms.MenuItem mnuPlay;
        private System.Windows.Forms.MenuItem mnuStop;
        private System.Windows.Forms.MenuItem mnuPause;
        private System.Windows.Forms.MenuItem menuItem2;
        private System.Windows.Forms.MenuItem mnuFull;
        private System.Windows.Forms.ToolBar toolBar1;
        private System.Windows.Forms.ToolBarButton toolBarButton1;
        private System.Windows.Forms.ToolBarButton toolBarButton2;
        private System.Windows.Forms.ToolBarButton toolBarButton3;
        private System.Windows.Forms.ToolBarButton toolBarButton4;
        private System.Windows.Forms.ToolBarButton toolBarButton5;
        private System.Windows.Forms.MenuItem mnuExit;
        #endregion

        public AVPlayer()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            OpenFile();
        }

        private bool _IsVideo = false;

        /** <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            CleanupObjects();
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        Windows Form Designer generated code#region Windows Form Designer generated code
        /** <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.mnuMain = new System.Windows.Forms.MainMenu();
            this.mnuFile = new System.Windows.Forms.MenuItem();
            this.mnuOpen = new System.Windows.Forms.MenuItem();
            this.menuItem3 = new System.Windows.Forms.MenuItem();
            this.mnuExit = new System.Windows.Forms.MenuItem();
            this.menuItem1 = new System.Windows.Forms.MenuItem();
            this.mnuPlay = new System.Windows.Forms.MenuItem();
            this.mnuStop = new System.Windows.Forms.MenuItem();
            this.mnuPause = new System.Windows.Forms.MenuItem();
            this.menuItem2 = new System.Windows.Forms.MenuItem();
            this.mnuFull = new System.Windows.Forms.MenuItem();
            this.ofdOpen = new System.Windows.Forms.OpenFileDialog();
            this.toolBar1 = new System.Windows.Forms.ToolBar();
            this.toolBarButton1 = new System.Windows.Forms.ToolBarButton();
            this.toolBarButton2 = new System.Windows.Forms.ToolBarButton();
            this.toolBarButton3 = new System.Windows.Forms.ToolBarButton();
            this.toolBarButton4 = new System.Windows.Forms.ToolBarButton();
            this.toolBarButton5 = new System.Windows.Forms.ToolBarButton();
            this.SuspendLayout();
            // 
            // mnuMain
            // 
            this.mnuMain.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                                                                    this.mnuFile,
                                                                                    this.menuItem1});
            // 
            // mnuFile
            // 
            this.mnuFile.Index = 0;
            this.mnuFile.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                                                                    this.mnuOpen,
                                                                                    this.menuItem3,
                                                                                    this.mnuExit});
            this.mnuFile.Text = "&File";
            // 
            // mnuOpen
            // 
            this.mnuOpen.Index = 0;
            this.mnuOpen.Shortcut = System.Windows.Forms.Shortcut.CtrlO;
            this.mnuOpen.Text = "&Open Clip";
            this.mnuOpen.Click += new System.EventHandler(this.mnuOpen_Click);
            // 
            // menuItem3
            // 
            this.menuItem3.Index = 1;
            this.menuItem3.Text = "-";
            // 
            // mnuExit
            // 
            this.mnuExit.Index = 2;
            this.mnuExit.Text = "E&xit";
            this.mnuExit.Click += new System.EventHandler(this.mnuExit_Click);
            // 
            // menuItem1
            // 
            this.menuItem1.Index = 1;
            this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                                                                      this.mnuPlay,
                                                                                      this.mnuStop,
                                                                                      this.mnuPause,
                                                                                      this.menuItem2,
                                                                                      this.mnuFull});
            this.menuItem1.Text = "&Control";
            // 
            // mnuPlay
            // 
            this.mnuPlay.Index = 0;
            this.mnuPlay.Shortcut = System.Windows.Forms.Shortcut.CtrlP;
            this.mnuPlay.Text = "&Play";
            this.mnuPlay.Click += new System.EventHandler(this.mnuPlay_Click);
            // 
            // mnuStop
            // 
            this.mnuStop.Index = 1;
            this.mnuStop.Shortcut = System.Windows.Forms.Shortcut.CtrlS;
            this.mnuStop.Text = "&Stop";
            this.mnuStop.Click += new System.EventHandler(this.mnuStop_Click);
            // 
            // mnuPause
            // 
            this.mnuPause.Index = 2;
            this.mnuPause.Shortcut = System.Windows.Forms.Shortcut.CtrlA;
            this.mnuPause.Text = "P&ause";
            this.mnuPause.Click += new System.EventHandler(this.mnuPause_Click);
            // 
            // menuItem2
            // 
            this.menuItem2.Index = 3;
            this.menuItem2.Text = "-";
            // 
            // mnuFull
            // 
            this.mnuFull.Index = 4;
            this.mnuFull.Text = "Toggle Fu&llscreen\t<Alt-Enter>";
            this.mnuFull.Click += new System.EventHandler(this.mnuFull_Click);
            // 
            // toolBar1
            // 
            this.toolBar1.Buttons.AddRange(new System.Windows.Forms.ToolBarButton[] {
                                                                                        this.toolBarButton1,
                                                                                        this.toolBarButton2,
                                                                                        this.toolBarButton3,
                                                                                        this.toolBarButton4,
                                                                                        this.toolBarButton5});
            this.toolBar1.DropDownArrows = true;
            this.toolBar1.Location = new System.Drawing.Point(0, 0);
            this.toolBar1.Name = "toolBar1";
            this.toolBar1.ShowToolTips = true;
            this.toolBar1.Size = new System.Drawing.Size(536, 42);
            this.toolBar1.TabIndex = 0;
            this.toolBar1.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(this.toolBar1_ButtonClick);
            // 
            // toolBarButton1
            // 
            this.toolBarButton1.Text = "Play";
            // 
            // toolBarButton2
            // 
            this.toolBarButton2.Text = "Stop";
            // 
            // toolBarButton3
            // 
            this.toolBarButton3.Text = "End";
            // 
            // toolBarButton4
            // 
            this.toolBarButton4.Text = "Begin";
            // 
            // toolBarButton5
            // 
            this.toolBarButton5.Text = "Next";
            // 
            // AVPlayer
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(536, 305);
            this.Controls.Add(this.toolBar1);
            this.Menu = this.mnuMain;
            this.Name = "AVPlayer";
            this.Text = "Audio Video Player";
            this.ResumeLayout(false);

        }
        #endregion

        private void CleanupObjects()
        {
            if (ourVideo != null)
                ourVideo.Dispose();
            if (ourAudio != null)
                ourAudio.Dispose();
        }

        private void OpenFile()
        {
//            if ((ofdOpen.InitialDirectory == null) || (ofdOpen.InitialDirectory == string.Empty))
//                ofdOpen.InitialDirectory = DXUtil.SdkMediaPath;

            ofdOpen.Filter = filterText;
            ofdOpen.Title = "Open media file";
            ofdOpen.ShowDialog(this);

            // Now let's try to open this file
            if ((ofdOpen.FileName != null) && (ofdOpen.FileName != string.Empty))
            {
                try
                {
                    if (ourVideo == null)
                    {
                        // First try to open this as a video file
                        ourVideo = new Video(ofdOpen.FileName);
                        ourVideo.Ending += new System.EventHandler(this.ClipEnded);
                        ourVideo.Owner = this;
                        // Start playing now
                        ourVideo.Play();
                        this._IsVideo = true;
                    }
                    else
                    {
                        ourVideo.Open(ofdOpen.FileName, true);
                    }
                }
                catch
                {
                    try
                    {
                        // opening this as a video file failed.. Maybe it's audio only?
                        ourAudio = new Audio(ofdOpen.FileName);
                        ourAudio.Ending += new System.EventHandler(this.ClipEnded);
                        // Start playing now
                        ourAudio.Play();
                        this._IsVideo = false;
                    }
                    catch
                    {
                        MessageBox.Show("This file could not be opened.", "Invalid file.", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
        }

        private void ClipEnded(object sender, System.EventArgs e)
        {
            // The clip has ended, stop and restart it
//            if (ourVideo != null)
//            {
//                ourVideo.Stop();
//                ourVideo.Play();
//            }
//            else
//            {
//                if (ourAudio != null)
//                {
//                    ourAudio.Stop();
//                    ourAudio.Play();
//                }
//            }
        }

        private void mnuOpen_Click(object sender, System.EventArgs e)
        {
            this.OpenFile();
        }

        private void mnuPlay_Click(object sender, System.EventArgs e)
        {
            if (ourVideo != null)
                ourVideo.Play();
            else
            {
                if (ourAudio != null)
                    ourAudio.Play();
            }
        }

        private void mnuStop_Click(object sender, System.EventArgs e)
        {
            if (ourVideo != null)
                ourVideo.Stop();
            else
            {
                if (ourAudio != null)
                    ourAudio.Stop();
            }
        }

        private void mnuPause_Click(object sender, System.EventArgs e)
        {
            if (ourVideo != null)
                ourVideo.Pause();
            else
            {
                if (ourAudio != null)
                    ourAudio.Pause();
            }
        }

        private void mnuExit_Click(object sender, System.EventArgs e)
        {
            this.Dispose();
        }

        private void mnuFull_Click(object sender, System.EventArgs e)
        {
            if (ourVideo != null)
                ourVideo.Fullscreen = !ourVideo.Fullscreen;
        }
        protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e)
        {
            if ( (e.Alt) && (e.KeyCode == System.Windows.Forms.Keys.Return))
            {
                mnuFull_Click(mnuFull, null);
            }

            // Allow the control to handle the keystroke now
            base.OnKeyDown(e);
        }

        private void toolBar1_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e)
        {
            
            switch(e.Button.Text)
            {
                case "Play":
                    if(this._IsVideo)
                    {
                        this.ourVideo.Play();
                    }
                    else
                    {
                        this.ourAudio.Play();
                    }
                    break;
                case "End":
                    if(_IsVideo)
                    {
                        double m_length = this.ourVideo.Duration;                    
                        try
                        {
                            if(this.ourVideo.SeekingCaps.CanSeekForwards)
                            {
                                double m_result = this.ourVideo.SeekCurrentPosition(5,SeekPositionFlags.AbsolutePositioning);
                                MessageBox.Show(m_result.ToString());
                            }
                        }
                        catch(Exception ex)
                        {
                            MessageBox.Show(ex.Message);
                        }
                        this.ourVideo.Pause();
                    }
                    else
                    {
                        double m_length = this.ourAudio.Duration;
                        double m_result = this.ourAudio.SeekCurrentPosition(5,SeekPositionFlags.AbsolutePositioning);
                        this.ourAudio.Pause();
                    }
                    break;
                case "Begin":
                    if(_IsVideo)
                    {
                        this.ourVideo.SeekCurrentPosition(0,SeekPositionFlags.AbsolutePositioning);
                        this.ourVideo.Pause();
                    }
                    else
                    {
                        this.ourAudio.SeekCurrentPosition(0,SeekPositionFlags.AbsolutePositioning);
                        this.ourAudio.Pause();
                    }
                    break;
                case "Stop":
                    if(_IsVideo)
                    {
                        this.ourVideo.Pause();
                    }
                    else
                    {
                        this.ourAudio.Pause();
                    }
                    break;
                case "Next":
                    if(_IsVideo)
                    {
                        this.ourVideo.SeekCurrentPosition(5,SeekPositionFlags.IncrementalPositioning);
                        //this.ourVideo.Pause();
                    }
                    else
                    {
                        this.ourAudio.SeekCurrentPosition(5,SeekPositionFlags.IncrementalPositioning);
                        //this.ourAudio.Pause();
                    }
                    break;
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值