/// <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); }
public Play(VideoLayerCollection myDS, Size VideoSize) { ds = myDS; MoveSize = VideoSize; ds.Sort(new SortComparer <Layer>("Level", false)); des = new DESCombine(DESConsts.FPS, DESConsts.BitCount, MoveSize.Width, MoveSize.Height, ds); DynamicTextDS = ds.FindAll(DynamicTextLayer); }
/// <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); }
// private static IDESPaintVisitor Visitor = new DESPaintVisitor(); public bool CreateVideo(MessageInfo mes, string fileurl) { Check.Require(mes, "mes", Check.NotNull); Check.Require(fileurl, "fileurl", Check.NotNullOrEmpty); Check.Require(mes.Size != Size.Empty, "mes.Size != null"); bool result = false; var layers = PopulateData(mes.Items); foreach (Layer layer in layers) { layer.Rect = new Rectangle(layer.Rect.X / mes.Zoom, layer.Rect.Y / mes.Zoom, layer.Rect.Width / mes.Zoom, layer.Rect.Height / mes.Zoom); //item.Rect = new Rectangle(item.Rect.Height / mes.Zoom, item.Rect.Width / mes.Zoom, item.Rect.X / mes.Zoom, item.Rect.Y / mes.Zoom); } layers.BackColor = mes.BackColor; layers.SignType = SignType.RGB; //layers.VideoSize = mes.GetSignSize(); layers.VideoSize = mes.Items[0].Shape.SignSize; layers.Name = mes.Name; layers.Zoom = 1; //layers.Zoom = mes.Zoom; layers.PlayLength = mes.Length; layers.ParentName = ""; layers.EmphasisEffect = mes.EmphasisEffect; if (layers.Count > 1) { layers.Sort(new SortComparer <Layer>("Level", false)); } var DynamicTextDS = layers.FindAll(item => { return(item.LayerType == LayerType.DynamicText); }); IBaseFilter ibfVideoCompressor = GetVideoCompressor("Indeo?video 5.10 Compression Filter"); PlayState PlayState = ProWrite.Core.PlayState.Stop; var des = new DESCombine(DESConsts.FPS, DESConsts.BitCount, layers.VideoSize.Width, layers.VideoSize.Height, layers); des.Completed += delegate { PlayState = PlayState.Stop; }; des.RenderToVideo(MediaSubType.Mpeg2Video, fileurl, ibfVideoCompressor, null, null, null, DynamicTextDS, 0, mes.Length, layers.VideoSize); des.StartRendering(); PlayState = PlayState.Run; while (PlayState == PlayState.Run) { Thread.Sleep(100); } des.Dispose(); des = null; if (System.IO.File.Exists(fileurl)) { result = true; } return(result); }
private void Completed(object o, System.EventArgs e) { CompletedArgs ca = e as CompletedArgs; button1.Text = "Doit"; tbStatus.Text = ca.Result.ToString(); ds.Dispose(); ds = null; groupBox2.Enabled = true; GC.Collect(); GC.WaitForPendingFinalizers(); }
/// <summary> /// 当输出视频结束后触发此完成事件 /// </summary> /// <param name="o"></param> /// <param name="e"></param> private void OutCompleted(object o, System.EventArgs e) { CompletedArgs ca = e as CompletedArgs; PlayState = PlayState.Stop; if (des != null) { des.Dispose(); } des = null; GC.Collect(); GC.WaitForPendingFinalizers(); }
/// <summary> /// Run Message /// </summary> public void Run() { try { if (PlayCompleted != null) { des.Completed += new EventHandler(PlayCompleted); } des.RenderToFrame(hWin, pVideo, null, DynamicTextDS, new DsRect(new Rectangle(0, 0, ds.VideoSize.Width, ds.VideoSize.Height)), 0, ds.PlayLength); des.StartRendering(); PlayState = PlayState.Run; } catch { des.Dispose(); des = null; } }
/// <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> /// 将视频中的一个片段输出成视频文件 /// </summary> /// <param name="filename"></param> public bool OutputVideo(string filename, long start, long end) { try { bool result = false; if (MoveSize == Size.Empty) { return(false); } des.Completed += new EventHandler(OutCompleted); IBaseFilter ibfVideoCompressor = GetVideoCompressor("Indeo?video 5.10 Compression Filter"); des.RenderToVideo(MediaSubType.Mpeg2Video, filename, ibfVideoCompressor, null, null, null, DynamicTextDS, start, end, MoveSize); des.StartRendering(); PlayState = PlayState.Run; while (PlayState == PlayState.Run) { Thread.Sleep(100); } if (System.IO.File.Exists(filename)) { result = true; } return(result); } catch { if (des != null) { PlayState = PlayState.Stop; des.Dispose(); des = null; } return(false); } }
public void Generate() { Check.Require(Layers, "Layers", Check.NotNull); Check.Require(Layers.Count, "Layers.Count", Check.GreaterThan <int>(0)); Check.Require(Tick, "Tick", Check.GreaterThanOrEqual <int>(0)); ILog _log = LogManager.GetLogger(typeof(IOHelper)); Layers.Sort(new SortComparer <Layer>("Level", false)); var DynamicTextDS = Layers.FindAll(item => item.LayerType == LayerType.DynamicText); if (Layers.Count == 0) { //TODO: var img = new Bitmap(Layers.VideoSize.Width, Layers.VideoSize.Height); using (var g = Graphics.FromImage(img)) { g.Clear(Layers.BackColor); } NailImage = img; return; } 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 (Exception e) { _log.Error("Generale ThumNail Exception on callBack.", e); _log.Error(e); } }; des.Completed += onCompleted; pnl.Width = Layers.VideoSize.Width; pnl.Height = Layers.VideoSize.Height; des.RenderToFrame(pnl, callback, null, DynamicTextDS, DsRect.FromRectangle(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 (Exception e) { _log.Error("Generale ThumNail Exception on general.", e); _log.Error(e); des.Cancel(); } } }
private ShapeLayer MergeVideoLayers(MessageInfo mes, ShapeLayer[] videoLayers) { string fileID = Guid.NewGuid().ToString().Replace("-", ""); string fileName = LocalFilePathMapping.GetFile(FileType.Video, fileID); var layers = new VideoLayerCollection(); Layer layer = null; long minStartTime = 0; long maxEndTime = 0; Array.ForEach <ShapeLayer>(videoLayers, item => { layer = DESLayerConverter.Instance.Convert(item); //comment out by Louis,for change video start time same as video layer's start time //layer.Level++; if (layer.Level == 0) { minStartTime = layer.StartTime; maxEndTime = layer.EndTime; } else { if (layer.StartTime < minStartTime) { minStartTime = layer.StartTime; } if (layer.EndTime > maxEndTime) { maxEndTime = layer.EndTime; } } layer.Rect = new System.Drawing.Rectangle(layer.Rect.X / mes.Zoom, layer.Rect.Y / mes.Zoom, layer.Rect.Width / mes.Zoom, layer.Rect.Height / mes.Zoom); layers.Add(layer); }); layers.BackColor = mes.BackColor; layers.SignType = SignType.RGB; layers.VideoSize = videoLayers[0].Shape.SignSize; layers.Name = mes.Name; layers.Zoom = 1; layers.PlayLength = maxEndTime - minStartTime; layers.ParentName = ""; layers.EmphasisEffect = mes.EmphasisEffect; if (layers.Count > 1) { layers.Sort(new SortComparer <Layer>("Level", false)); } IBaseFilter ibfVideoCompressor = DESHelper.GetVideoCompressor("Indeo?video 5.10 Compression Filter"); PlayState state = ProWrite.Core.PlayState.Stop; var des = new DESCombine(DESConsts.FPS, DESConsts.BitCount, layers.VideoSize.Width, layers.VideoSize.Height, layers); des.Completed += (s, e) => state = PlayState.Stop; des.RenderToVideo(MediaSubType.Mpeg2Video, fileName, ibfVideoCompressor, null, null, null, new List <Layer>(), 0, mes.Length, layers.VideoSize); des.StartRendering(); state = PlayState.Run; while (state == PlayState.Run) { Thread.Sleep(100); } des.Dispose(); des = null; var newLayer = videoLayers[0].Copy(); ShapeVideo shape = newLayer.Shape as ShapeVideo; if (shape == null)//shape.Type == Gif { shape = new ShapeVideo(); shape.FromTo(newLayer.Shape); newLayer.Shape = shape; } shape.VideoFileID = fileID; shape.VideoUrl = fileName; newLayer.EntryEffect = LayerEffect.Empty; newLayer.ExitEffect = LayerEffect.Empty; newLayer.EmphasisEffect = LayerEffect.Empty; newLayer.EmphasisEffect.Left = (int)minStartTime * Constance.Effect.UnitWidth; newLayer.EmphasisEffect.Width = (int)maxEndTime * Constance.Effect.UnitWidth; return(newLayer); }
private void button1_Click(object sender, System.EventArgs e) { try { if (ds == null) { MyCallback pVideo = new MyCallback(tbVideo, tbTime, tbElapsed, progressBar1); MyCallback pAudio = new MyCallback(tbAudio); // FPS, BPP, Width, Height ds = new DESCombine(30, 24, 320, 240); foreach (Chunk c in listBox1.Items) { if (c.sVideoFile == c.sAudioFile) { ds.AddAVFile(c.sVideoFile, c.lStart, c.lEnd); } else { if (c.sVideoFile != null) { ds.AddVideoFile(c.sVideoFile, c.lStart, c.lEnd); } if (c.sAudioFile != null) { ds.AddAudioFile(c.sAudioFile, c.lStart, c.lEnd); } } } if (rbToScreen.Checked) { ds.RenderToWindow(IntPtr.Zero, pVideo, pAudio); } else if (rbToAVI.Checked) { IBaseFilter ibfVideoCompressor = GetVideoCompressor(tbCompressor.Text); ds.RenderToAVI(tbOutput.Text, ibfVideoCompressor, null, pVideo, pAudio); } else { MessageBox.Show("Programming error"); } if (cbShowXML.Checked) { MessageBox.Show(ds.GetXML(), "XML representation of the DES graph"); } ds.Completed += new EventHandler(Completed); ds.FileCompleted += new EventHandler(FileCompleted); ds.StartRendering(); groupBox2.Enabled = false; progressBar1.Maximum = (int)(ds.MediaLength / (DESCombine.UNITS / 10)); progressBar1.Step = progressBar1.Maximum / 20; progressBar1.Value = 0; tbStatus.Text = "Running"; button1.Text = "Cancel"; } else { ds.Cancel(); } } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); ds.Dispose(); ds = 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(); } } }