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();
|
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 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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue