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