// 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); }
/// <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); } }
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); }