Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
 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);
 }
Esempio n. 3
0
 /// <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);
 }
Esempio n. 4
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);
        }
Esempio n. 5
0
 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();
 }
Esempio n. 6
0
        /// <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();
        }
Esempio n. 7
0
 /// <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;
     }
 }
Esempio n. 8
0
 /// <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;
     }
 }
Esempio n. 9
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);
            }
        }
Esempio n. 10
0
        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();
                }
            }
        }
Esempio n. 11
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);
        }
Esempio n. 12
0
        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;
            }
        }
Esempio n. 13
0
        /// <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);
            }
        }
Esempio n. 14
0
        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();
                }
            }
        }