/// <summary> /// 指定时间来截取视频中的图片 /// </summary> /// <param name="FileName"></param> /// <param name="ImgFormat"></param> /// <param name="lTime"></param> public Image GetImage(double lTime) { Image img = null; int MaxCount = lTime <= 0 ? DESConsts.BitCount : (int)lTime * DESConsts.BitCount; try { Panel pnl = new Panel(); pVideo = new DESVideoCallBack(); pnl.Width = this.hWin.Width; pnl.Height = this.hWin.Height; des.RenderToFrame(pnl, pVideo, null, DynamicTextDS, DsRect.FromRectangle(hWin.ClientRectangle), 0, ds.PlayLength); des.StartRendering(); des.put_CurrentPosition(lTime); while (pVideo.m_FrameCount < MaxCount) { Thread.Sleep(100); } des.Pause(); img = des.GetImage(); des.Cancel(); } catch { des.Cancel(); des = null; } return(img); }
/// <summary> /// 构造和初始播放视频的数据 /// </summary> /// <param name="ds"></param> /// <param name="myWin"></param> public Play(VideoLayerCollection myDS, DESVideoCallBack pVideoCallback, Control myWin) { hWin = myWin; ds = myDS; pVideo = pVideoCallback; ds.Sort(new SortComparer <Layer>("Level", false)); des = new DESCombine(DESConsts.FPS, DESConsts.BitCount, hWin.Width, hWin.Height, ds); DynamicTextDS = ds.FindAll(DynamicTextLayer); }
/// <summary> /// 释放资源 /// </summary> protected override void Dispose(bool disposing) { if (des != null) { des.Dispose(); des = null; } if (PlayEvent != null) { PlayEvent = null; } if (PlayListCompleted != null) { PlayListCompleted = null; } if (PlayCompleted != null) { PlayCompleted = null; } if (m_PlayBar != null) { m_PlayBar = null; } if (m_MediaTime != null) { m_MediaTime = null; } if (pVideo != null) { pVideo = null; } if (hWin != null) { hWin = null; } }
/// <summary> /// Start PlayList /// </summary> private void StartPlay() { EventArgs ca = new EventArgs(); int RunTime = 0; curNum = 0; PlayState = PlayState.Next; while (curNum >= 0 && curNum < dsArr.Length) { if (PlayState == PlayState.Stop) { if (des != null) { des.Cancel(); } break; } if (PlayState == PlayState.Next) { dsArr[curNum].Sort(new SortComparer <Layer>("Level", false)); des = new DESCombine(DESConsts.FPS, DESConsts.BitCount, hWin.Width, hWin.Height, dsArr[curNum]); DynamicTextDS = dsArr[curNum].FindAll(DynamicTextLayer); des.Completed += new EventHandler(Completed); pVideo = new DESVideoCallBack(RunTime, m_PlayBar, m_MediaTime); des.RenderToFrame(hWin, pVideo, null, DynamicTextDS, DsRect.FromRectangle(hWin.ClientRectangle), 0, dsArr[curNum].PlayLength); des.StartRendering(); PlayState = PlayState.Run; PlayLength = DESHelper.FormatTime(dsArr[curNum].PlayLength); } else { if (PlayState == PlayState.Run) { curLength += 1000000; } if (curLength >= PlayLength) { RunTime += (int)dsArr[curNum].PlayLength; curNum++; curLength = 0; PlayState = PlayState.Next; if (curNum == dsArr.Length) { PlayState = PlayState.Stop; } if (des != null) { des.Stop(); } } Thread.Sleep(100); } } if (des != null) { des.Cancel(); } hWin.Refresh(); if (PlayListCompleted != null) { PlayListCompleted(this, ca); } }
public void Generate() { Check.Require(Layers, "Layers", Check.NotNull); Check.Require(Layers.Length, "Layers.Length", Check.GreaterThan <int>(0)); Check.Require(HWnd, "HWnd", Check.NotNull); Check.Require(Tick, "Tick", Check.GreaterThanOrEqual <int>(0)); var layers = helper.PopulateDataBatchLoad(Layers); layers.BackColor = HWnd.BackColor; //layers.VideoSize = new Size(ControlService.SignCombo.Current.Width, ControlService.SignCombo.Current.Height); layers.VideoSize = HWnd.Size; layers.Sort(new SortComparer <Layer>("Level", false)); var DynamicTextDS = layers.FindAll(item => { return(item.LayerType == LayerType.DynamicText); }); if (layers.Count == 0) { //TODO: var img = new Bitmap(HWnd.Width, HWnd.Height); using (var g = Graphics.FromImage(img)) { g.Clear(HWnd.BackColor); } NailImage = img; return; } //using (var des = new DESCombine(DESConsts.FPS, DESConsts.BitCount, HWnd.Width, HWnd.Height, layers)) var des = new DESCombine(DESConsts.FPS, DESConsts.BitCount, layers.VideoSize.Width, layers.VideoSize.Height, layers); { int MaxCount = Tick <= 0 ? DESConsts.BitCount : (int)Tick * DESConsts.BitCount; ManualResetEvent mre = new ManualResetEvent(false); bool hasSign = false; try { Control.CheckForIllegalCrossThreadCalls = false; Panel pnl = new Panel(); var callback = new DESVideoCallBack(); EventHandler onCompleted = delegate { if (des != null) { des.Dispose(); } Control.CheckForIllegalCrossThreadCalls = true; if (!hasSign) { hasSign = true; mre.Set(); } }; callback.OnCallBack = () => { try { if (callback.m_FrameCount == 5) { des.Pause(); hasSign = true; mre.Set(); } } catch { } }; des.Completed += onCompleted; pnl.Width = layers.VideoSize.Width; pnl.Height = layers.VideoSize.Height; des.RenderToFrame(pnl, callback, null, DynamicTextDS, DsRect.FromRectangle(HWnd.ClientRectangle), 0, layers.PlayLength); des.StartRendering(); des.put_CurrentPosition(Tick); mre.WaitOne(); mre.Close(); if (des != null && !des.IsDisposed) { NailImage = des.GetImage(); des.Cancel(); } } catch { des.Cancel(); } } }