mirror of
https://github.com/rosenbjerg/FFMpegCore.git
synced 2024-11-10 08:34:12 +01:00
Add Configure on FFMpegArgumentProcessor to fuently configure ffoptions per run.
This commit is contained in:
parent
e052688209
commit
965e756dc4
2 changed files with 42 additions and 12 deletions
|
@ -14,6 +14,7 @@ namespace FFMpegCore
|
||||||
public class FFMpegArgumentProcessor
|
public class FFMpegArgumentProcessor
|
||||||
{
|
{
|
||||||
private static readonly Regex ProgressRegex = new Regex(@"time=(\d\d:\d\d:\d\d.\d\d?)", RegexOptions.Compiled);
|
private static readonly Regex ProgressRegex = new Regex(@"time=(\d\d:\d\d:\d\d.\d\d?)", RegexOptions.Compiled);
|
||||||
|
private readonly List<Action<FFOptions>> _configurations;
|
||||||
private readonly FFMpegArguments _ffMpegArguments;
|
private readonly FFMpegArguments _ffMpegArguments;
|
||||||
private Action<double>? _onPercentageProgress;
|
private Action<double>? _onPercentageProgress;
|
||||||
private Action<TimeSpan>? _onTimeProgress;
|
private Action<TimeSpan>? _onTimeProgress;
|
||||||
|
@ -22,6 +23,7 @@ public class FFMpegArgumentProcessor
|
||||||
|
|
||||||
internal FFMpegArgumentProcessor(FFMpegArguments ffMpegArguments)
|
internal FFMpegArgumentProcessor(FFMpegArguments ffMpegArguments)
|
||||||
{
|
{
|
||||||
|
_configurations = new List<Action<FFOptions>>();
|
||||||
_ffMpegArguments = ffMpegArguments;
|
_ffMpegArguments = ffMpegArguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,10 +72,15 @@ public FFMpegArgumentProcessor CancellableThrough(CancellationToken token, int t
|
||||||
token.Register(() => CancelEvent?.Invoke(this, timeout));
|
token.Register(() => CancelEvent?.Invoke(this, timeout));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
public FFMpegArgumentProcessor Configure(Action<FFOptions> configureOptions)
|
||||||
|
{
|
||||||
|
_configurations.Add(configureOptions);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
public bool ProcessSynchronously(bool throwOnError = true, FFOptions? ffMpegOptions = null)
|
public bool ProcessSynchronously(bool throwOnError = true, FFOptions? ffMpegOptions = null)
|
||||||
{
|
{
|
||||||
using var instance = PrepareInstance(ffMpegOptions ?? GlobalFFOptions.Current, out var cancellationTokenSource);
|
var options = GetConfiguredOptions(ffMpegOptions);
|
||||||
var errorCode = -1;
|
using var instance = PrepareInstance(options, out var cancellationTokenSource);
|
||||||
|
|
||||||
void OnCancelEvent(object sender, int timeout)
|
void OnCancelEvent(object sender, int timeout)
|
||||||
{
|
{
|
||||||
|
@ -88,6 +95,7 @@ void OnCancelEvent(object sender, int timeout)
|
||||||
CancelEvent += OnCancelEvent;
|
CancelEvent += OnCancelEvent;
|
||||||
instance.Exited += delegate { cancellationTokenSource.Cancel(); };
|
instance.Exited += delegate { cancellationTokenSource.Cancel(); };
|
||||||
|
|
||||||
|
var errorCode = -1;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
errorCode = Process(instance, cancellationTokenSource).ConfigureAwait(false).GetAwaiter().GetResult();
|
errorCode = Process(instance, cancellationTokenSource).ConfigureAwait(false).GetAwaiter().GetResult();
|
||||||
|
@ -106,8 +114,8 @@ void OnCancelEvent(object sender, int timeout)
|
||||||
|
|
||||||
public async Task<bool> ProcessAsynchronously(bool throwOnError = true, FFOptions? ffMpegOptions = null)
|
public async Task<bool> ProcessAsynchronously(bool throwOnError = true, FFOptions? ffMpegOptions = null)
|
||||||
{
|
{
|
||||||
using var instance = PrepareInstance(ffMpegOptions ?? GlobalFFOptions.Current, out var cancellationTokenSource);
|
var options = GetConfiguredOptions(ffMpegOptions);
|
||||||
var errorCode = -1;
|
using var instance = PrepareInstance(options, out var cancellationTokenSource);
|
||||||
|
|
||||||
void OnCancelEvent(object sender, int timeout)
|
void OnCancelEvent(object sender, int timeout)
|
||||||
{
|
{
|
||||||
|
@ -121,6 +129,7 @@ void OnCancelEvent(object sender, int timeout)
|
||||||
}
|
}
|
||||||
CancelEvent += OnCancelEvent;
|
CancelEvent += OnCancelEvent;
|
||||||
|
|
||||||
|
var errorCode = -1;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
errorCode = await Process(instance, cancellationTokenSource).ConfigureAwait(false);
|
errorCode = await Process(instance, cancellationTokenSource).ConfigureAwait(false);
|
||||||
|
@ -163,6 +172,18 @@ private bool HandleCompletion(bool throwOnError, int exitCode, IReadOnlyList<str
|
||||||
return exitCode == 0;
|
return exitCode == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private FFOptions GetConfiguredOptions(FFOptions? ffOptions)
|
||||||
|
{
|
||||||
|
var options = ffOptions ?? GlobalFFOptions.Current.Clone();
|
||||||
|
|
||||||
|
foreach (var configureOptions in _configurations)
|
||||||
|
{
|
||||||
|
configureOptions(options);
|
||||||
|
}
|
||||||
|
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
private Instance PrepareInstance(FFOptions ffOptions,
|
private Instance PrepareInstance(FFOptions ffOptions,
|
||||||
out CancellationTokenSource cancellationTokenSource)
|
out CancellationTokenSource cancellationTokenSource)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace FFMpegCore
|
namespace FFMpegCore
|
||||||
{
|
{
|
||||||
public class FFOptions
|
public class FFOptions : ICloneable
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Working directory for the ffmpeg/ffprobe instance
|
/// Working directory for the ffmpeg/ffprobe instance
|
||||||
|
@ -38,5 +39,13 @@ public class FFOptions
|
||||||
/// Whether to cache calls to get ffmpeg codec, pixel- and container-formats
|
/// Whether to cache calls to get ffmpeg codec, pixel- and container-formats
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool UseCache { get; set; } = true;
|
public bool UseCache { get; set; } = true;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
object ICloneable.Clone() => Clone();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new object that is a copy of the current instance.
|
||||||
|
/// </summary>
|
||||||
|
public FFOptions Clone() => (FFOptions)MemberwiseClone();
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue