Fix progress and add unit test

This commit is contained in:
Malte Rosenbjerg 2020-03-02 22:50:04 +01:00
parent 081627ef25
commit 55a7e74817
2 changed files with 32 additions and 18 deletions

View file

@ -351,5 +351,32 @@ public void Video_Duration() {
output.Delete(); output.Delete();
} }
} }
[TestMethod]
public void Video_UpdatesProgress() {
var output = Input.OutputLocation(VideoType.Mp4);
var percentageDone = 0.0;
void OnProgess(double percentage) => percentageDone = percentage;
Encoder.OnProgress += OnProgess;
var arguments = new ArgumentContainer
{
new InputArgument(VideoLibrary.LocalVideo),
new DurationArgument(TimeSpan.FromSeconds(8)),
new OutputArgument(output)
};
try {
Encoder.Convert(arguments);
Encoder.OnProgress -= OnProgess;
Assert.IsTrue(File.Exists(output.FullName));
Assert.AreNotEqual(0.0, percentageDone);
} finally {
if (File.Exists(output.FullName))
output.Delete();
}
}
} }
} }

View file

@ -479,8 +479,6 @@ public void Stop()
private readonly string _ffmpegPath; private readonly string _ffmpegPath;
private TimeSpan _totalTime; private TimeSpan _totalTime;
private volatile StringBuilder _errorOutput = new StringBuilder();
private bool RunProcess(ArgumentContainer container, FileInfo output) private bool RunProcess(ArgumentContainer container, FileInfo output)
{ {
_instance?.Dispose(); _instance?.Dispose();
@ -492,7 +490,7 @@ private bool RunProcess(ArgumentContainer container, FileInfo output)
if (!File.Exists(output.FullName) || new FileInfo(output.FullName).Length == 0) if (!File.Exists(output.FullName) || new FileInfo(output.FullName).Length == 0)
{ {
throw new FFMpegException(FFMpegExceptionType.Process, _errorOutput); throw new FFMpegException(FFMpegExceptionType.Process, string.Join("\n", _instance.ErrorData));
} }
return exitCode == 0; return exitCode == 0;
@ -509,31 +507,20 @@ private void Cleanup(IEnumerable<string> pathList)
} }
} }
private static readonly Regex ProgressRegex = new Regex(@"\w\w:\w\w:\w\w", RegexOptions.Compiled); private static readonly Regex ProgressRegex = new Regex(@"time=(\d\d:\d\d:\d\d.\d\d?)", RegexOptions.Compiled);
private Instance _instance; private Instance _instance;
private void OutputData(object sender, (DataType Type, string Data) msg) private void OutputData(object sender, (DataType Type, string Data) msg)
{ {
var (type, data) = msg;
if (data == null) return;
if (type == DataType.Error)
{
_errorOutput.AppendLine(data);
return;
}
#if DEBUG #if DEBUG
Trace.WriteLine(data); Trace.WriteLine(msg.Data);
#endif #endif
if (OnProgress == null) return; if (OnProgress == null) return;
if (!data.Contains("frame")) return;
var match = ProgressRegex.Match(data); var match = ProgressRegex.Match(msg.Data);
if (!match.Success) return; if (!match.Success) return;
var processed = TimeSpan.Parse(match.Value, CultureInfo.InvariantCulture); var processed = TimeSpan.Parse(match.Groups[1].Value, CultureInfo.InvariantCulture);
var percentage = Math.Round(processed.TotalSeconds / _totalTime.TotalSeconds * 100, 2); var percentage = Math.Round(processed.TotalSeconds / _totalTime.TotalSeconds * 100, 2);
OnProgress(percentage); OnProgress(percentage);
} }