小记一下DirectX里的Video和Audio

原本是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

        
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

        
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;
            }

        }

    }

}


原文地址:https://www.cnblogs.com/WuCountry/p/807434.html