diff --git a/FFMpegCore/FFMPEG/Argument/Atoms/AudioSamplingRateArgument.cs b/FFMpegCore/FFMPEG/Argument/Atoms/AudioSamplingRateArgument.cs
new file mode 100644
index 0000000..ee612b8
--- /dev/null
+++ b/FFMpegCore/FFMPEG/Argument/Atoms/AudioSamplingRateArgument.cs
@@ -0,0 +1,18 @@
+namespace FFMpegCore.FFMPEG.Argument
+{
+ ///
+ /// Audio sampling rate argument. Defaults to 48000 (Hz)
+ ///
+ public class AudioSamplingRateArgument : Argument
+ {
+ public AudioSamplingRateArgument() : base(48000) { }
+
+ public AudioSamplingRateArgument(int samplingRate) : base(samplingRate) { }
+
+ ///
+ public override string GetStringValue()
+ {
+ return $"-ar {Value}";
+ }
+ }
+}
\ No newline at end of file
diff --git a/FFMpegCore/FFMPEG/FFMpeg.cs b/FFMpegCore/FFMPEG/FFMpeg.cs
index b13dbbd..e43486f 100644
--- a/FFMpegCore/FFMPEG/FFMpeg.cs
+++ b/FFMpegCore/FFMPEG/FFMpeg.cs
@@ -88,7 +88,7 @@ public Bitmap Snapshot(VideoInfo source, FileInfo output, Size? size = null, Tim
new OutputArgument(output)
);
- if (!RunProcess(container, output))
+ if (!RunProcess(container, output, false))
{
throw new OperationCanceledException("Could not take snapshot!");
}
@@ -198,7 +198,7 @@ public VideoInfo PosterWithAudio(FileInfo image, FileInfo audio, FileInfo output
new ShortestArgument(true),
new OutputArgument(output)
);
- if (!RunProcess(container, output))
+ if (!RunProcess(container, output, false))
{
throw new FFMpegException(FFMpegExceptionType.Operation,
"An error occured while adding the audio file to the image.");
@@ -274,7 +274,7 @@ public VideoInfo JoinImageSequence(FileInfo output, double frameRate = 30, param
try
{
- if (!RunProcess(container, output))
+ if (!RunProcess(container, output, false))
{
throw new FFMpegException(FFMpegExceptionType.Operation,
"Could not join the provided image sequence.");
@@ -346,7 +346,7 @@ public FileInfo ExtractAudio(VideoInfo source, FileInfo output)
new OutputArgument(output)
);
- if (!RunProcess(container, output))
+ if (!RunProcess(container, output, false))
{
throw new FFMpegException(FFMpegExceptionType.Operation,
"Could not extract the audio from the requested video.");
@@ -381,26 +381,26 @@ public VideoInfo ReplaceAudio(VideoInfo source, FileInfo audio, FileInfo output,
));
}
- public VideoInfo Convert(ArgumentContainer arguments)
+ public VideoInfo Convert(ArgumentContainer arguments, bool skipExistsCheck = false)
{
var (sources, output) = GetInputOutput(arguments);
if (sources != null)
_totalTime = TimeSpan.FromSeconds(sources.Sum(source => source.Duration.TotalSeconds));
- if (!RunProcess(arguments, output))
- throw new FFMpegException(FFMpegExceptionType.Operation, "Could not replace the video audio.");
+ if (!RunProcess(arguments, output, skipExistsCheck))
+ throw new FFMpegException(FFMpegExceptionType.Conversion, "Could not process file without error");
_totalTime = TimeSpan.MinValue;
return new VideoInfo(output);
}
- public async Task ConvertAsync(ArgumentContainer arguments)
+ public async Task ConvertAsync(ArgumentContainer arguments, bool skipExistsCheck = false)
{
var (sources, output) = GetInputOutput(arguments);
if (sources != null)
_totalTime = TimeSpan.FromSeconds(sources.Sum(source => source.Duration.TotalSeconds));
- if (!await RunProcessAsync(arguments, output))
- throw new FFMpegException(FFMpegExceptionType.Operation, "Could not replace the video audio.");
+ if (!await RunProcessAsync(arguments, output, skipExistsCheck))
+ throw new FFMpegException(FFMpegExceptionType.Conversion, "Could not process file without error");
_totalTime = TimeSpan.MinValue;
return new VideoInfo(output);
@@ -442,7 +442,7 @@ public void Stop()
private readonly string _ffmpegPath;
private TimeSpan _totalTime;
- private bool RunProcess(ArgumentContainer container, FileInfo output)
+ private bool RunProcess(ArgumentContainer container, FileInfo output, bool skipExistsCheck)
{
_instance?.Dispose();
var arguments = ArgumentBuilder.BuildArguments(container);
@@ -478,21 +478,22 @@ private bool RunProcess(ArgumentContainer container, FileInfo output)
exitCode = _instance.BlockUntilFinished();
}
- if (!File.Exists(output.FullName) || new FileInfo(output.FullName).Length == 0)
+ if (!skipExistsCheck && (!File.Exists(output.FullName) || new FileInfo(output.FullName).Length == 0))
throw new FFMpegException(FFMpegExceptionType.Process, string.Join("\n", _instance.ErrorData));
return exitCode == 0;
}
- finally
+ finally
{
if (inputPipeArgument != null)
inputPipeArgument.ClosePipe();
}
}
- private async Task RunProcessAsync(ArgumentContainer container, FileInfo output)
+ private async Task RunProcessAsync(ArgumentContainer container, FileInfo output, bool skipExistsCheck)
{
_instance?.Dispose();
var arguments = ArgumentBuilder.BuildArguments(container);
+
int exitCode = -1;
if (container.TryGetArgument(out var inputPipeArgument))
{
@@ -517,7 +518,7 @@ private async Task RunProcessAsync(ArgumentContainer container, FileInfo o
exitCode = await _instance.FinishedRunning();
}
- if (!File.Exists(output.FullName) || new FileInfo(output.FullName).Length == 0)
+ if (!skipExistsCheck && (!File.Exists(output.FullName) || new FileInfo(output.FullName).Length == 0))
throw new FFMpegException(FFMpegExceptionType.Process, string.Join("\n", _instance.ErrorData));
return exitCode == 0;
diff --git a/FFMpegCore/FFMpegCore.csproj b/FFMpegCore/FFMpegCore.csproj
index 56b870d..a3fca0d 100644
--- a/FFMpegCore/FFMpegCore.csproj
+++ b/FFMpegCore/FFMpegCore.csproj
@@ -10,10 +10,9 @@
1.0.12
1.1.0.0
1.1.0.0
- Add more argument types and make ffprobe output capacity configurable
-Update dependency
+ Adds AudioSamplingRateArgument
8
- 1.3.1
+ 1.3.3
Vlad Jerca, Malte Rosenbjerg
ffmpeg ffprobe convert video audio mediafile resize analyze muxing
GitHub