private void bkWorker_DoWork(object sender, DoWorkEventArgs e) { if (mPlayer == IntPtr.Zero) { return; } try { Debug.WriteLine("Stop playing..."); PlayerMethods.CEPlayer_Close(mPlayer); Debug.WriteLine("Stop played..."); } catch (AccessViolationException ex) { Debug.WriteLine($"Stop ESC ex: {ex.Message}"); } catch (Exception ex1) { Debug.WriteLine($"Stop ex: {ex1.Message}"); } mPlayer = IntPtr.Zero; this.Invoke(new Action(() => { this.btnPlay.Text = "播放"; this.btnPlay.Enabled = true; tmrTip.Stop(); mTipCount = 0; this.lblView.Refresh(); })); }
/// <summary> /// 鼠标抬起后进行进度切换,并等待切换完成 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void pgrPlay_MouseUp(object sender, MouseEventArgs e) { Debug.WriteLine("Mouse up"); if (mPlayer == IntPtr.Zero || mTotalTime < 1000) { return; } try { PlayerMethods.CEPlayer_Play(mPlayer); PlayerMethods.CEPlayer_Seek(mPlayer, this.pgrPlay.Value); mCurrentTime = PlayerMethods.GetLongParam(mPlayer, CE_PARAM_ID.PARAM_MEDIA_POSITION); } catch { } this.BeginInvoke(new Action(() => { for (int i = 0; i < 200; i++) { System.Threading.Thread.Sleep(5); Int64 curMs = PlayerMethods.GetLongParam(mPlayer, CE_PARAM_ID.PARAM_MEDIA_POSITION); if (Math.Abs(curMs - mCurrentTime) > 500) { break; } } tmrPlay.Start(); })); }
/// <summary> /// 快放 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnFast_Click(object sender, EventArgs e) { if (mPlayer == IntPtr.Zero) { return; } if (mPlaySpeed <= 100) { mPlaySpeed = 120; } else { mPlaySpeed += 20; } if (mPlaySpeed > 180) { mPlaySpeed = 100; } PlayerMethods.SetParam(mPlayer, CE_PARAM_ID.PARAM_PLAY_SPEED_VALUE, mPlaySpeed); if (mPlaySpeed == 100) { ShowTipString("正常播放"); } else { ShowTipString($"X{(mPlaySpeed - 100) / 10}快速播放"); } }
/// <summary> /// 截图 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnScreenshot_Click(object sender, EventArgs e) { if (mPlayer == IntPtr.Zero) { MessageBox.Show("未播放,无法截图。。。"); } else { string snapPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Snapshot"); if (!Directory.Exists(snapPath)) { Directory.CreateDirectory(snapPath); } string fileName = Path.Combine(snapPath, DateTime.Now.ToString("yyyyMMddHHmmss") + ".jpg"); try { if (PlayerMethods.CEPlayer_Snapshot(mPlayer, fileName, 0, 0, 0) == 0) { // MessageBox.Show($"截图成功:[{fileName}]"); ShowTipString("截图成功"); } else { MessageBox.Show("截图失败。。。"); } } catch (Exception ex) { MessageBox.Show($"截图失败:{ex.Message}"); } } }
/// <summary> /// 显示OSD提示信息 /// </summary> /// <param name="aMsg"></param> private void ShowTipString(string aMsg) { if (mPlayer == IntPtr.Zero) { return; } tmrTip.Stop(); mTipString = string.Copy(aMsg); try { // 再次进行判断,防止已经被关掉 if (mPlayer == IntPtr.Zero) { return; } PlayerMethods.CEPlayer_SetOSD(mPlayer, 20, 20, Color.FromArgb(0, 255, 0).ToArgb(), mTipString); mTipCount = 0; tmrTip.Start(); } catch { } }
/// <summary> /// 连接状态变更 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void lblView_ConnectStatusChanged(object sender, PlayerStatusEventArgs e) { switch (e.Status) { case PlayerMethods.MSG_OPEN_DONE: if (mPlayer == IntPtr.Zero) { // 有时候结束也会触发该事件 break; } PlayerMethods.CEPlayer_SetOSDFont(mPlayer, "微软雅黑", 24); ShowTipString($"成功打开链接{DateTime.Now.ToLongTimeString()}..."); Debug.WriteLine("Open done..."); mTotalTime = PlayerMethods.GetLongParam(mPlayer, CE_PARAM_ID.PARAM_MEDIA_DURATION); Debug.WriteLine($"Total time is {mTotalTime}ms"); this.BeginInvoke(new Action(() => { // 更新音量及拉伸样式 trackVolume_ValueChanged(null, null); chkScaleMode_CheckedChanged(null, null); this.btnRecord.Enabled = true; this.btnScreenshot.Enabled = true; this.btnFast.Enabled = this.btnSlow.Enabled = true; // this.trackVolume.Enabled = true; this.pgrPlay.Enabled = (mTotalTime > 999); int totalSecond = (int)(mTotalTime / 1000); mCurrentTime = 0; this.pgrPlay.Value = 0; this.pgrPlay.Maximum = (int)mTotalTime; this.lblCurTime.Text = "00:00"; this.lblTotalTime.Text = string.Format("{0:D2}:{1:D2}", totalSecond / 60, totalSecond % 60); this.tmrPlay.Start(); })); break; case PlayerMethods.MSG_OPEN_FAILED: Debug.WriteLine("Open fail..."); break; case PlayerMethods.MSG_PLAY_COMPLETED: Debug.WriteLine("Play completed..."); if (mTotalTime > 1000) { StopPlay(); } break; case PlayerMethods.MSG_STREAM_CONNECTED: Debug.WriteLine("Connected..."); break; case PlayerMethods.MSG_STREAM_DISCONNECT: Debug.WriteLine("Disconnected..."); this.BeginInvoke(new Action(() => this.lblView.Refresh())); break; default: break; } }
/// <summary> /// Trackbar控件鼠标按下时暂停播放以进行进度切换 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void pgrPlay_MouseDown(object sender, MouseEventArgs e) { Debug.WriteLine("Mouse down"); if (mPlayer == IntPtr.Zero || mTotalTime < 1000) { return; } PlayerMethods.CEPlayer_Pause(mPlayer); tmrPlay.Stop(); this.pgrPlay.Value = this.pgrPlay.Maximum * e.Location.X / this.pgrPlay.Width; }
/// <summary> /// 进度条更新控制 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void tmrPlay_Tick(object sender, EventArgs e) { if (mPlayer == IntPtr.Zero || mTotalTime < 1000) { return; } // 当前秒 mCurrentTime = PlayerMethods.GetLongParam(mPlayer, CE_PARAM_ID.PARAM_MEDIA_POSITION); int curSecond = (int)(mCurrentTime / 1000); this.lblCurTime.Text = string.Format("{0:D2}:{1:D2}", curSecond / 60, curSecond % 60); this.pgrPlay.Value = (int)(mCurrentTime > this.pgrPlay.Maximum ? this.pgrPlay.Maximum : mCurrentTime); }
/// <summary> /// 切换播放区域大小 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void lblView_SizeChanged(object sender, EventArgs e) { if (mPlayer != IntPtr.Zero) { try { PlayerMethods.CEPlayer_Resize(mPlayer, 0, 0, 0, this.lblView.Width, this.lblView.Height); } catch { } } }
private bool StartPlay(string aUrl) { if (string.IsNullOrEmpty(aUrl)) { return false; } StopPlay(); Url = aUrl; this.btnPlay.Enabled = false; mTotalTime = 0; mCurrentTime = 0; this.mPlaySpeed = 100; try { Debug.WriteLine("Start play..."); // mPlayer = (IntPtr)Invoke(new Func<IntPtr>(() => PlayerMethods.CEPlayer_Open(Url, this.lblView.Handle, CE_VIDEO_RENDER_TYPE.VIDEO_RENDER_TYPE_GDI, // CE_VIDEO_SCALE_MODE.VIDEO_MODE_STRETCHED, 100, 50))); // this.trackVolume.Value = 7; int volume = -255 + this.trackVolume.Value * 50; mPlayer = PlayerMethods.CEPlayer_Open(this.Url, this.lblView.Handle, CE_VIDEO_RENDER_TYPE.VIDEO_RENDER_TYPE_GDI, this.chkScaleMode.Checked ? CE_VIDEO_SCALE_MODE.VIDEO_MODE_STRETCHED : CE_VIDEO_SCALE_MODE.VIDEO_MODE_LETTERBOX, 100, volume); // mPlayer = PlayerMethods.player_open(this.Url, this.lblView.Handle, IntPtr.Zero); Debug.WriteLine("Start playing..."); } catch (AccessViolationException ex) { Debug.WriteLine($"Stop ESC ex: {ex.Message}"); } catch (Exception ex) { mPlayer = IntPtr.Zero; MessageBox.Show($"播放流媒体失败:{ex.Message}"); this.btnPlay.Enabled = true; return false; } if (mPlayer == IntPtr.Zero) { MessageBox.Show("播放流媒体失败..."); this.btnPlay.Enabled = true; return false; } PlayerMethods.CEPlayer_Play(mPlayer); this.btnPlay.Enabled = true; return true; }
/// <summary> /// 修改音量 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void trackVolume_ValueChanged(object sender, EventArgs e) { if (mPlayer == IntPtr.Zero) { return; } try { int volume = -255 + this.trackVolume.Value * 50; PlayerMethods.SetParam(mPlayer, CE_PARAM_ID.PARAM_AUDIO_VOLUME, volume); } catch { } }
/// <summary> /// 拉伸状态变换事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void chkScaleMode_CheckedChanged(object sender, EventArgs e) { if (mPlayer == IntPtr.Zero) { return; } try { PlayerMethods.SetParam(mPlayer, CE_PARAM_ID.PARAM_VIDEO_MODE, (int)(this.chkScaleMode.Checked ? CE_VIDEO_SCALE_MODE.VIDEO_MODE_STRETCHED : CE_VIDEO_SCALE_MODE.VIDEO_MODE_LETTERBOX)); } catch { } }
/// <summary> /// 提示取消定时器 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void tmrTip_Tick(object sender, EventArgs e) { if (mTipCount++ > 20) { if (mPlayer != IntPtr.Zero) { try { mTipString = string.Empty; PlayerMethods.CEPlayer_SetOSD(mPlayer, 20, 20, 0, mTipString); } catch { } } mTipCount = 0; tmrTip.Stop(); } }
/// <summary> /// 录像 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnRecord_Click(object sender, EventArgs e) { if (this.btnRecord.Text == "停止") { StopRecord(); return; } if (mPlayer == IntPtr.Zero) { MessageBox.Show("未播放,无法录像。。。"); } else { this.btnRecord.Enabled = false; string recordPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Record"); if (!Directory.Exists(recordPath)) { Directory.CreateDirectory(recordPath); } string fileName = Path.Combine(recordPath, DateTime.Now.ToString("yyyyMMddHHmmss") + ".mp4"); try { if (PlayerMethods.CEPlayer_Record(mPlayer, fileName) == 0) { mIsRecording = true; this.btnRecord.Text = "停止"; ShowTipString("开始录像..."); } else { MessageBox.Show("录像失败。。。"); } } catch (Exception ex) { MessageBox.Show($"录像出现异常:{ex.Message}"); } this.btnRecord.Enabled = true; } }
/// <summary> /// 提示取消定时器 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void tmrTip_Tick(object sender, EventArgs e) { if (mTipCount++ > 20) { if (mPlayer != IntPtr.Zero) { try { mTipString = string.Empty; PlayerMethods.CEPlayer_SetOSD(mPlayer, 20, 20, 0, mTipString); } catch { } } mTipCount = 0; tmrTip.Stop(); } // long bitRate = PlayerMethods.GetLongParam(mPlayer, CE_PARAM_ID.PARAM_VIDEO_BITRATE); // Debug.WriteLine($"bitRate is {bitRate}."); }
/// <summary> /// 停止播放 /// </summary> private void StopRecord() { if (!mIsRecording) { return; } this.btnRecord.Enabled = false; this.btnRecord.Text = "录像"; if (mPlayer != IntPtr.Zero) { try { PlayerMethods.CEPlayer_Stoprecord(mPlayer); ShowTipString("停止录像"); } catch { } } mIsRecording = false; this.btnRecord.Enabled = true; }