Beispiel #1
0
        /// <summary>
        /// Occurs when data is received from the executing application.
        /// </summary>
        private void FFmpeg_DataReceived(object sender, DataReceivedEventArgs e)
        {
            if (e.Data == null)
            {
                if (!isStarted && isFFmpeg)
                {
                    ParseFileInfo();
                }
                return;
            }

            output.AppendLine(e.Data);
            DataReceived?.Invoke(sender, e);

            if (isFFmpeg)
            {
                if (FileStreams == null && (e.Data.StartsWith("Output ") || e.Data.StartsWith("Press [q] to stop")))
                {
                    ParseFileInfo();
                }
                if (e.Data.StartsWith("Press [q] to stop") || e.Data.StartsWith("frame="))
                {
                    isStarted = true;
                }

                if (isStarted && e.Data.StartsWith("frame="))
                {
                    FFmpegStatus ProgressInfo = FFmpegParser.ParseProgress(e.Data);
                    StatusUpdated?.Invoke(this, new StatusUpdatedEventArgs(ProgressInfo));
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// Parses FFmpeg's progress into an object.
        /// </summary>
        /// <param name="text">The raw output line from FFmpeg.</param>
        /// <returns>A FFmpegProgress object.</returns>
        public FFmpegStatus ParseFFmpegProgress(string text)
        {
            FFmpegStatus Result = new FFmpegStatus();

            if (string.IsNullOrEmpty(text))
            {
                return(Result);
            }
            // frame=  929 fps=0.0 q=-0.0 size=   68483kB time=00:00:37.00 bitrate=15162.6kbits/s speed=  74x
            string[] Values = text.Split('=');
            try {
                Result.Frame     = long.Parse(ParseAttribute(text, "frame"), CultureInfo.InvariantCulture);
                Result.Fps       = float.Parse(ParseAttribute(text, "fps"), CultureInfo.InvariantCulture);
                Result.Quantizer = float.Parse(ParseAttribute(text, "q"), CultureInfo.InvariantCulture);
                Result.Size      = ParseAttribute(text, "size");
                Result.Time      = TimeSpan.Parse(ParseAttribute(text, "time"), CultureInfo.InvariantCulture);
                Result.Bitrate   = ParseAttribute(text, "bitrate");
                string SpeedString = ParseAttribute(text, "speed");
                if (SpeedString != "N/A")
                {
                    Result.Speed = float.Parse(SpeedString.TrimEnd('x'), CultureInfo.InvariantCulture);
                }
            } catch {
            }
            return(Result);
        }
        /// <summary>
        /// Parses FFmpeg's progress into an object.
        /// </summary>
        /// <param name="text">The raw output line from FFmpeg.</param>
        /// <returns>A FFmpegProgress object.</returns>
        internal static FFmpegStatus ParseProgress(string text)
        {
            FFmpegStatus Result     = new FFmpegStatus();
            var          qtdOutputs = _quantizerRegex.Matches(text).Count;


            //if (text.IndexOf("Lq") == -1)
            //{
            // frame=  929 fps=0.0 q=-0.0 size=   68483kB time=00:00:37.00 bitrate=15162.6kbits/s speed=  74x
            // frame= 4151 fps=130 q=-1.0 Lq=-1.0 size=N/A time=00:06:55.00 bitrate=N/A dup=0 drop=16566 speed=  13x
            string[] Values = text.Split('=');
            try
            {
                Result.Frame = int.Parse(Values[1].TrimStart().Split(' ')[0], CultureInfo.InvariantCulture);
                Result.Fps   = float.Parse(Values[2].TrimStart().Split(' ')[0], CultureInfo.InvariantCulture);
                var i = 0;
                for (; i < qtdOutputs; i++)
                {
                    Result.Quantizer = float.Parse(Values[3 + i].TrimStart().Split(' ')[0], CultureInfo.InvariantCulture);
                }
                i--;
                Result.Size    = Values[4 + i].TrimStart().Split(' ')[0];
                Result.Time    = TimeSpan.Parse(Values[5 + i].TrimStart().Split(' ')[0], CultureInfo.InvariantCulture);
                Result.Bitrate = Values[6 + i].TrimStart().Split(' ')[0];
                string SpeedString = Values[7 + i].Trim().Split('x')[0];
                if (SpeedString != "N/A")
                {
                    Result.Speed = float.Parse(SpeedString, CultureInfo.InvariantCulture);
                }
            }
            catch
            {
            }
            //}
            //else
            //{
            //  string[] Values = text.Split('=');
            //  try
            //  {
            //    Result.Frame = int.Parse(Values[1].TrimStart().Split(' ')[0], CultureInfo.InvariantCulture);
            //    Result.Fps = float.Parse(Values[2].TrimStart().Split(' ')[0], CultureInfo.InvariantCulture);
            //    Result.Quantizer = float.Parse(Values[3].TrimStart().Split(' ')[0], CultureInfo.InvariantCulture);
            //    Result.Size = Values[5].TrimStart().Split(' ')[0];
            //    Result.Time = TimeSpan.Parse(Values[6].TrimStart().Split(' ')[0], CultureInfo.InvariantCulture);
            //    Result.Bitrate = Values[7].TrimStart().Split(' ')[0];
            //    string SpeedString = Values[8].Trim().Split('x')[0];
            //    if (SpeedString != "N/A")
            //      Result.Speed = float.Parse(SpeedString, CultureInfo.InvariantCulture);
            //  }
            //  catch
            //  {
            //  }
            //}
            return(Result);
        }
Beispiel #4
0
        /// <summary>
        /// Occurs when data is received from the executing application.
        /// </summary>
        private void FFmpeg_DataReceived(object sender, DataReceivedEventArgs e)
        {
            if (e.Data == null)
            {
                // We're reading both Output and Error streams, only parse on 2nd null.
                if (!isStarted && encoder != EncoderApp.Other)
                {
                    ParseFileInfo();
                }
                return;
            }

            output.AppendLine(e.Data);
            DataReceived?.Invoke(sender, e);

            if (encoder == EncoderApp.FFmpeg)
            {
                if (FileStreams == null && (e.Data.StartsWith("Output ") || e.Data.StartsWith("Press [q] to stop")))
                {
                    ParseFileInfo();
                }
                if (e.Data.StartsWith("Press [q] to stop") || e.Data.StartsWith("frame="))
                {
                    isStarted = true;
                }

                if (isStarted && e.Data.StartsWith("frame="))
                {
                    FFmpegStatus ProgressInfo = FFmpegParser.ParseFFmpegProgress(e.Data);
                    LastStatusReceived = ProgressInfo;
                    StatusUpdated?.Invoke(this, new StatusUpdatedEventArgs(ProgressInfo));
                }
            }
            else if (encoder == EncoderApp.x264)
            {
                if (!isStarted && e.Data.StartsWith("frames "))
                {
                    isStarted = true;
                }
                else if (isStarted && e.Data.Length == 48)
                {
                    FFmpegStatus ProgressInfo = FFmpegParser.ParseX264Progress(e.Data);
                    LastStatusReceived = ProgressInfo;
                    StatusUpdated?.Invoke(this, new StatusUpdatedEventArgs(ProgressInfo));
                }
            }
        }
Beispiel #5
0
        /// <summary>
        /// Parses x264's progress into an object.
        /// </summary>
        /// <param name="text">The raw output line from FFmpeg.</param>
        /// <returns>A FFmpegProgress object.</returns>
        public FFmpegStatus ParseX264Progress(string text)
        {
            FFmpegStatus Result = new FFmpegStatus();

            if (text == null || text.Length != 48)
            {
                return(Result);
            }

            //      1   0.10  10985.28    0:00:10    22.35 KB
            string[] Values = text.Split('=');
            try {
                Result.Frame   = int.Parse(text.Substring(0, 6).Trim());
                Result.Fps     = float.Parse(text.Substring(6, 7).Trim());
                Result.Bitrate = text.Substring(13, 10).Trim();
                Result.Size    = text.Substring(34, 12).Trim();
            } catch {
            }
            return(Result);
        }
Beispiel #6
0
        /// <summary>
        /// Parses FFmpeg's progress into an object.
        /// </summary>
        /// <param name="text">The raw output line from FFmpeg.</param>
        /// <returns>A FFmpegProgress object.</returns>
        internal static FFmpegStatus ParseProgress(string text)
        {
            FFmpegStatus Result = new FFmpegStatus();

            // frame=  929 fps=0.0 q=-0.0 size=   68483kB time=00:00:37.00 bitrate=15162.6kbits/s speed=  74x
            string[] Values = text.Split('=');
            try {
                Result.Frame     = int.Parse(Values[1].TrimStart().Split(' ')[0], CultureInfo.InvariantCulture);
                Result.Fps       = float.Parse(Values[2].TrimStart().Split(' ')[0], CultureInfo.InvariantCulture);
                Result.Quantizer = float.Parse(Values[3].TrimStart().Split(' ')[0], CultureInfo.InvariantCulture);
                Result.Size      = Values[4].TrimStart().Split(' ')[0];
                Result.Time      = TimeSpan.Parse(Values[5].TrimStart().Split(' ')[0], CultureInfo.InvariantCulture);
                Result.Bitrate   = Values[6].TrimStart().Split(' ')[0];
                string SpeedString = Values[7].Trim().Split('x')[0];
                if (SpeedString != "N/A")
                {
                    Result.Speed = float.Parse(SpeedString, CultureInfo.InvariantCulture);
                }
            }
            catch {
            }
            return(Result);
        }
Beispiel #7
0
 public StatusUpdatedEventArgs(FFmpegStatus progress)
 {
     Status = progress;
 }