mirror of
https://github.com/rosenbjerg/FFMpegCore.git
synced 2024-11-10 08:34:12 +01:00
Fix progress and add unit test
This commit is contained in:
parent
081627ef25
commit
55a7e74817
2 changed files with 32 additions and 18 deletions
|
@ -351,5 +351,32 @@ public void Video_Duration() {
|
|||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -479,8 +479,6 @@ public void Stop()
|
|||
private readonly string _ffmpegPath;
|
||||
private TimeSpan _totalTime;
|
||||
|
||||
private volatile StringBuilder _errorOutput = new StringBuilder();
|
||||
|
||||
private bool RunProcess(ArgumentContainer container, FileInfo output)
|
||||
{
|
||||
_instance?.Dispose();
|
||||
|
@ -492,7 +490,7 @@ private bool RunProcess(ArgumentContainer container, FileInfo output)
|
|||
|
||||
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;
|
||||
|
@ -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 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
|
||||
Trace.WriteLine(data);
|
||||
Trace.WriteLine(msg.Data);
|
||||
#endif
|
||||
|
||||
if (OnProgress == null) return;
|
||||
if (!data.Contains("frame")) return;
|
||||
|
||||
var match = ProgressRegex.Match(data);
|
||||
var match = ProgressRegex.Match(msg.Data);
|
||||
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);
|
||||
OnProgress(percentage);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue