public void RenderMedia(string mediaFileName)
{
clearUp();
try
{
objMedia = new FilgraphManager();
objMedia.RenderFile(mediaFileName);
volMedia = objMedia as IBasicAudio;
posMedia = objMedia as IMediaPosition;
ctlMedia = objMedia as IMediaControl;
eexMedia = objMedia as IMediaEventEx;
eexMedia.SetNotifyWindow((int)this.Handle, WM_GRAPHNOTIFY, 0);
mediaStatus = 1;
mediaDuration = posMedia.Duration;
volMedia.Volume = mediaVolum;
Play();
}
catch
{
MessageBox.Show("加载文件失败!");
clearUp();
}
}
其中ClearUp用于释放资源
private void clearUp()
{
if (ctlMedia != null)
ctlMedia.Stop();
mediaStatus = 1;
mediaDuration = 0;
mediaCurPos = 0;
if (eexMedia != null)
eexMedia.SetNotifyWindow(0, 0, 0);
if (ctlMedia != null) ctlMedia = null;
if (volMedia != null) volMedia = null;
if (posMedia != null) posMedia = null;
if (eexMedia != null) eexMedia = null;
if (objMedia != null) objMedia = null;
}
基本功能调用代码比较简单
/// <summary>
/// 播放
/// </summary>
public void Play()
{
ctlMedia.Run();
mediaStatus = 3;
}
/// <summary>
/// 暂停
/// </summary>
public void Pause()
{
ctlMedia.Pause();
mediaStatus = 2;
}
/// <summary>
/// 停止
/// </summary>
public void Stop()
{
ctlMedia.Stop();
posMedia.CurrentPosition = 0;
mediaStatus = 1;
}
/// <summary>
/// 搜索
/// </summary>
/// <param name="posTar">秒</param>
public void Seek(int posTar)
{
posMedia.CurrentPosition = posTar;
}
有一点必须注意,播放过程中的窗体消息处理,需要重写WndProc方法。
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_GRAPHNOTIFY)
{
int lEventCode;
int lParam1, lParam2;
while (true)
{
try
{
eexMedia.GetEvent(out lEventCode, out lParam1, out lParam2, 0);
eexMedia.FreeEventParams(lEventCode, lParam1, lParam2);
if (lEventCode == EC_COMPLETE)
{
ctlMedia.Stop();
posMedia.CurrentPosition = 0;
mediaStatus = 1;
}
}
catch (Exception)
{
break;
}
}
}
base.WndProc(ref m);
}