Пример #1
0
        private PendingFrame ProcessFrame()
        {
            _frameOrig = (FFmpeg.AVFrame)Marshal.PtrToStructure(_pFrameOrig, typeof(FFmpeg.AVFrame));

            IntPtr pStream = Marshal.ReadIntPtr(_formatContext.streams, _videoStreamIndex * 4);
            var    stream  = (FFmpeg.AVStream)Marshal.PtrToStructure(pStream, typeof(FFmpeg.AVStream));

            _videoCodecContext = (FFmpeg.AVCodecContext)Marshal.PtrToStructure(stream.codec, typeof(FFmpeg.AVCodecContext));

            if (_videoFrameFirstDTS == null)
            {
                _videoFrameFirstDTS = _frameOrig.pkt_dts;
            }
            if (_videoFieldDTSDuration == null)
            {
                _videoFieldDTSDuration = _frameOrig.pkt_duration / _videoCodecContext.ticks_per_frame;
            }

            var fieldList = new List <FrameField>();

            //---------- Start YUV Image ----------
            if (OutputYData || OutputYImage)
            {
                _scalerY.ProcessImage(_pFrameOrig, _frameOrig);
            }
            //---------- End YUV Image ----------

            //---------- Start RGB Image ----------
            if (OutputRGBImage && !OutputYImage)
            {
                _scalerRGB.ProcessImage(_pFrameOrig, _frameOrig);
            }
            //---------- End RGB Image ----------

            for (int fieldIndex = 0; fieldIndex < _videoCodecContext.ticks_per_frame; fieldIndex++)
            {
                var field = new FrameField();

                if (OutputYData || OutputYImage)
                {
                    field.YData = _scalerY.GetYData(fieldIndex);
                    if (OutputYImage)
                    {
                        field.Image = _scalerY.GetImage(fieldIndex);
                        //field.Image.Save(@"D:\temp\image.png", System.Drawing.Imaging.ImageFormat.Png);
                    }
                }

                if (OutputRGBImage && !OutputYImage)
                {
                    field.Image = _scalerRGB.GetImage(fieldIndex);
                    //field.Image.Save(@"D:\temp\image.png", System.Drawing.Imaging.ImageFormat.Png);
                }

                field.PTS          = (_frameOrig.pkt_dts - _videoFrameFirstDTS.Value) + (fieldIndex * _videoFieldDTSDuration.Value);
                field.Seconds      = field.PTS * _videoCodecContext.pkt_timebase.num / (double)_videoCodecContext.pkt_timebase.den;
                field.FieldIndex   = fieldIndex;
                field.FieldNumber  = (int)(field.PTS / _videoFieldDTSDuration.Value);
                field.FrameNumber  = (int)(field.FieldNumber / _videoCodecContext.ticks_per_frame);
                field.FilePosition = _frameOrig.pkt_pos;
                field.AVFrame      = _frameOrig;

                fieldList.Add(field);
            }

            var frame = new PendingFrame();

            frame.Fields = fieldList.ToArray();

            return(frame);
        }