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