private void FFmpegProcessErrorDataReceived(object sender, ProcessHelper.ErrorDataReceivedEventArgs e) { if (e.ErrorData != null && !e.ErrorData.StartsWith("frame=", StringComparison.Ordinal)) { Xout.LogInf($"STDERR {DateTime.Now:HH:mm:ss.ffff}: {e.ErrorData}"); } }
/// <summary> /// Handles the ErrorDataReceived event of the Ffmpeg control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="ProcessHelper.ErrorDataReceivedEventArgs"/> instance containing the event data.</param> private void FfmpegErrorDataReceived(object sender, ProcessHelper.ErrorDataReceivedEventArgs e) { if (string.IsNullOrEmpty(e.ErrorData)) { return; } this.Dispatcher.Invoke(() => { var data = e.ErrorData; var dataTrimmed = data.Trim(); if (dataTrimmed.StartsWith("Input", StringComparison.CurrentCulture) || dataTrimmed.StartsWith("Stream", StringComparison.CurrentCulture) || dataTrimmed.StartsWith("Output", StringComparison.Ordinal) || dataTrimmed.Contains("Could not run graph") || dataTrimmed.Contains("I/O error")) { var textBlock = new TextBlock() { Text = $"{DateTime.Now:HH:mm:ss.fff}: {data}", Margin = new Thickness(4, 0, 4, 0), VerticalAlignment = VerticalAlignment.Center }; this.StaticData.Children.Add(textBlock); return; } if (data.StartsWith("frame", StringComparison.Ordinal)) { var match = Regex.Match(data, "frame=\\s*(?<frames>[^\\s]+)\\sfps=\\s*(?<fps>[^\\s]+)\\sq=\\s*(?<q1>[^\\s]+)\\s.*\\ssize=\\s*(?<size>[^\\s]+)\\stime=\\s*(?<time>[^\\s]+)\\sbitrate=\\s*(?<bitrate>[^\\s]+)\\s(dup=\\s*(?<dup>[^\\s]+)\\s)*(drop=\\s*(?<drop>[^\\s]+)\\s)*speed=\\s*(?<speed>[^\\s]+)"); if (!match.Success) { return; } var frameGroup = match.Groups["frames"]; var fpsGroup = match.Groups[nameof(this.fps)]; var q1Group = match.Groups[nameof(this.q1)]; //var q2Group = match.Groups["q2"]; var sizeGroup = match.Groups["size"]; var timeGroup = match.Groups["time"]; var bitrateGroup = match.Groups["bitrate"]; var speedGroup = match.Groups["speed"]; var dups = match.Groups["dup"]; var drops = match.Groups["drop"]; this.Frames.Text = frameGroup.Value; this.fps.Text = fpsGroup.Value; this.q1.Text = q1Group.Value; //this.q2.Text = q2Group.Value; this.Size.Text = sizeGroup.Value; this.Time.Text = timeGroup.Value; this.Bitrate.Text = bitrateGroup.Value; this.Speed.Text = speedGroup.Value; this.Dups.Text = dups.Value; this.Drops.Text = drops.Value; } }); }