CleanUp(); m_objFilterGraph = new FilgraphManager(); m_objFilterGraph.RenderFile(openFileDialog.FileName); m_objBasicAudio = m_objFilterGraph as IBasicAudio; try { m_objVideoWindow = m_objFilterGraph as IVideoWindow; m_objVideoWindow.Owner = (int) panel1.Handle; m_objVideoWindow.WindowStyle = WS_CHILD | WS_CLIPCHILDREN; m_objVideoWindow.SetWindowPosition(panel1.ClientRectangle.Left, panel1.ClientRectangle.Top, panel1.ClientRectangle.Width, panel1.ClientRectangle.Height); } catch (Exception ex) { m_objVideoWindow = null; } m_objMediaEvent = m_objFilterGraph as IMediaEvent; m_objMediaEventEx = m_objFilterGraph as IMediaEventEx; m_objMediaEventEx.SetNotifyWindow((int) this.Handle, WM_GRAPHNOTIFY, 0); m_objMediaPosition = m_objFilterGraph as IMediaPosition; m_objMediaControl = m_objFilterGraph as IMediaControl; // 如何来播放,暂停,中止 ? 简单这些函数看字面也知道 . // m_objMediaControl.Run();//播放 m_objMediaControl.Pause();// 暂停 m_objMediaControl.Stop();// 中止 // 这段代码很是简单。当用户单击播放/暂停按钮时,代码将检查 Player 的 playState 属性。若是 Player 正在播放数字媒体文件,代码就会暂停文件的播放; 若是 Player 已经暂停或中止,代码就再次启动 Player 播放文件。 OK, 在来看咱们是如何控制时间进度的 ? // private void timer1_Tick(object sender, System.EventArgs e) { if (m_CurrentStatus == MediaStatus.Running) { UpdateStatusBar(); } } |
private void UpdateStatusBar() { switch (m_CurrentStatus) { case MediaStatus.None : statusBarPanel1.Text = "Stopped"; break; case MediaStatus.Paused : statusBarPanel1.Text = "Paused "; break; case MediaStatus.Running: statusBarPanel1.Text = "Running"; break; case MediaStatus.Stopped: statusBarPanel1.Text = "Stopped"; break; } if (m_objMediaPosition != null) { int s = (int) m_objMediaPosition.Duration; int h = s / 3600; int m = (s - (h * 3600)) / 60; s = s - (h * 3600 + m * 60); statusBarPanel2.Text = String.Format("{0:D2}:{1:D2}:{2:D2}", h, m, s); s = (int) m_objMediaPosition.CurrentPosition; h = s / 3600; m = (s - (h * 3600)) / 60; s = s - (h * 3600 + m * 60); statusBarPanel3.Text = String.Format("{0:D2}:{1:D2}:{2:D2}", h, m, s); } else { statusBarPanel2.Text = "00:00:00"; statusBarPanel3.Text = "00:00:00"; } } |
protected override void WndProc(ref Message m) { if (m.Msg == WM_GRAPHNOTIFY) { int lEventCode; int lParam1, lParam2; while (true) { try { m_objMediaEventEx.GetEvent(out lEventCode,out lParam1,out lParam2,0); m_objMediaEventEx.FreeEventParams(lEventCode, lParam1, lParam2); if (lEventCode == EC_COMPLETE) { m_objMediaControl.Stop(); m_objMediaPosition.CurrentPosition = 0; m_CurrentStatus = MediaStatus.Stopped; UpdateStatusBar(); UpdateToolBar(); } } catch (Exception) { break; } } } base.WndProc(ref m); } |