예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }