public void RaisesStatusChangedEvent() { TranscodeStatus status = null; _transcodeJob.SourceInfo.Duration = new TimeSpan(0, 1, 23, 43, 480); _transcoder.Start(_transcodeJob); _transcoder.StatusChanged += s => status = s; _process.ErrorDataReceived += Raise.Event <Action <string> >( "frame= 1439 fps=3.3 q=-0.0 size= 119516kB time=01:02:47.61 " + "bitrate=16315.1kbits/s speed=0.139x"); Assert.IsNotNull(status); Assert.AreEqual(0.75, status.Percent); Assert.AreEqual(3.3, status.FramesPerSecond); Assert.AreEqual(122384384, status.Size); Assert.AreEqual(163179179, status.EstimatedTotalSize); Assert.AreEqual(0.139, status.Speed); Assert.AreEqual(new TimeSpan(0, 1, 2, 47, 610), status.Time); Assert.AreEqual(new TimeSpan(0, 2, 30, 35, 36), status.Eta); }
public void ParsesFFmpegStatusWithAdditonalParameters() { TranscodeStatus status = null; _transcodeJob.SourceInfo.Duration = new TimeSpan(1, 53, 23); _transcoder.Start(_transcodeJob); _transcoder.StatusChanged += s => status = s; _process.ErrorDataReceived += Raise.Event <Action <string> >( "frame=10697 fps= 32 q=25.0 size= 462080kB time=00:07:26.07 " + "bitrate=8485.9kbits/s dup=1 drop=0 speed=1.35x"); Assert.IsNotNull(status); Assert.AreEqual(0.0656, status.Percent, 0.0001); Assert.AreEqual(32, status.FramesPerSecond); Assert.AreEqual(473169920, status.Size); Assert.AreEqual(7216300056, status.EstimatedTotalSize); Assert.AreEqual(1.35, status.Speed); Assert.AreEqual(new TimeSpan(0, 0, 7, 26, 70), status.Time); Assert.AreEqual(new TimeSpan(0, 1, 18, 28, 837), status.Eta); }
void OnErrorDataReceived(string data) { if (string.IsNullOrWhiteSpace(data)) { return; } var matches = Regex.Matches(data, @"(?<key>[^\s]+)\s*=\s*(?<value>[^\s]+)"); if (matches.Count < 1) { if (!Regex.IsMatch(data, @"conversion\s+failed", RegexOptions.IgnoreCase) || (_lastError == null)) { _lastError = data; } return; } var status = new TranscodeStatus(); foreach (Match match in matches) { var key = match.Groups["key"].Value; var value = match.Groups["value"].Value; switch (key?.ToLower()) { case "fps": status.FramesPerSecond = double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out var fps) ? fps : default; break; case "size": status.Size = TryParseSize(value, out var size) ? size : default; break; case "speed": var val = value?.Replace("x", string.Empty); status.Speed = double.TryParse(val, NumberStyles.Any, CultureInfo.InvariantCulture, out var speed) ? speed : default; break; case "time": status.Time = TimeSpan.TryParse(value, CultureInfo.InvariantCulture, out var time) ? time : default; break; } } if (status.Time == TimeSpan.Zero) { return; } if (_sourceDuration > TimeSpan.Zero) { status.Percent = status.Time.TotalMilliseconds / _sourceDuration.TotalMilliseconds; if (status.Speed > 0) { status.Eta = CalculateEta(status.Time, _sourceDuration, status.Speed); } } if ((status.Percent > 0) && (status.Size > 0)) { status.EstimatedTotalSize = CalculateEstimatedTotalSize(status.Percent, status.Size); } StatusChanged?.Invoke(status); }