Пример #1
0
        // 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);
        }
Пример #2
0
        /// <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);
            }
        }
Пример #3
0
        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);
        }