/// <summary> /// This method will run in the background. Please subscribe to <see cref="OnConversionDidStart" />, /// <see cref="OnConversionDidFail" />, and <see cref="OnConversionDidFinish" /> events to get status updates and final /// processed data /// </summary> public void BuildAndRun() { Stopwatch watch = new Stopwatch(); Task.Run(() => { var processInfo = new ProcessStartInfo(Path.Combine(FFMpegLocation, FFMpegFilenames.FFMpeg)); string builtArgs = "-i "; if (InputFile == null) { throw new Exception("InputFile cannot be null"); } if (OutputFile == null) { throw new Exception("Output file cannot be null for BuildAndRun"); } builtArgs += InputFile.FullName; if (OverwriteOutputFile) { builtArgs += " -y"; } builtArgs += $" -c:v {OutputVideoCodec.ToString()}"; builtArgs += $" -c:a {OutputAudioCodec.ToString()}"; if (OutputBitrate.HasValue) { builtArgs += $" -b:v {OutputBitrate.Value.ToNormalizedString()}"; } if (OutputFrameRate != FrameRate.DEFAULT) { builtArgs += $" -r {(int)OutputFrameRate}"; } builtArgs += $" -cpu-used {NumCpuUsed.GetCpuParam()}"; if (OutputResolution.HasValue) { builtArgs += $" -s {OutputResolution.Value.ToNormalizedString()}"; } builtArgs += $" {OutputFile.FullName}"; processInfo.Arguments = builtArgs; processInfo.RedirectStandardError = true; processInfo.RedirectStandardInput = true; processInfo.RedirectStandardOutput = true; var process = new Process(); process.StartInfo = processInfo; watch.Start(); process.Start(); System.Console.WriteLine("Process started -- firing event"); OnConversionDidStart?.Invoke(this, new ConversionEventArgs(InputFile, OutputFile)); process.ErrorDataReceived += (object sender, DataReceivedEventArgs args) => { OnConversionDidFail?.Invoke(this, new ConversionEventArgs(InputFile, OutputFile)); }; process.WaitForExit(); watch.Stop(); }).ContinueWith((res) => { OnConversionDidFinish?.Invoke(this, new ConversionEventArgs(InputFile, OutputFile, watch.Elapsed)); }); }
/// <inheritdoc /> public IAudioStream SetCodec(AudioCodec codec, object Extraparams = null) { string input = codec.ToString(); if (codec == AudioCodec._4gv) { input = "4gv"; } else if (codec == AudioCodec._8svx_exp) { input = "8svx_exp"; } else if (codec == AudioCodec._8svx_fib) { input = "8svx_fib"; } return(SetCodec($"{input}", Extraparams)); }
/// <inheritdoc /> public IAudioStream SetCodec(AudioCodec codec) { string input = codec.ToString(); if (codec == AudioCodec._4gv) { input = "4gv"; } else if (codec == AudioCodec._8svx_exp) { input = "8svx_exp"; } else if (codec == AudioCodec._8svx_fib) { input = "8svx_fib"; } return(SetCodec($"{input}")); }
public string Convert(string inputFile, VideoEncoder videoEncoder, VideoResize videoResize, VideoPreset videoPreset, ConstantRateFactor videoConstantRateFactor, AudioCodec audioCodec, string outputFile) { //-vf scale=-1:720 -c:v libx264 -preset veryfast -crf 23 -c:a aac var arguments = "-i " + "\"" + inputFile + "\"" + " -v quiet -stats " + _arguments.GetValue(videoResize.ToString()) + _arguments.GetValue(videoEncoder.ToString()) + _arguments.GetValue(videoPreset.ToString()) + _arguments.GetValue(videoConstantRateFactor.ToString()) + _arguments.GetValue(audioCodec.ToString()) + " -y " + "\"" + outputFile + "\""; return(arguments); }
public async Task BasicTranscode_InputFileWithSubtitles_SkipSubtitlesWithParameter(VideoCodec videoCodec, AudioCodec audioCodec, SubtitleCodec subtitleCodec) { string output = _storageFixture.GetTempFileName(FileExtensions.Mp4); IConversionResult result = await(await FFmpeg.Conversions.FromSnippet.Transcode(Resources.MkvWithSubtitles, output, videoCodec, audioCodec, subtitleCodec, false)).Start(); IMediaInfo mediaInfo = await FFmpeg.GetMediaInfo(output); Assert.Equal(9, mediaInfo.Duration.Seconds); Assert.Single(mediaInfo.VideoStreams); Assert.Single(mediaInfo.AudioStreams); Assert.Empty(mediaInfo.SubtitleStreams); IAudioStream audioStream = mediaInfo.AudioStreams.First(); IVideoStream videoStream = mediaInfo.VideoStreams.First(); Assert.NotNull(videoStream); Assert.NotNull(audioStream); Assert.Equal(videoCodec.ToString(), videoStream.Codec); Assert.Equal(audioCodec.ToString(), audioStream.Codec); Assert.Equal(25, videoStream.Framerate); }
public async Task BasicTranscode_InputFileWithSubtitles_SkipSubtitles(VideoCodec videoCodec, AudioCodec audioCodec, SubtitleCodec subtitleCodec) { string output = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + FileExtensions.Mp4); IConversionResult result = await(await FFmpeg.Conversions.FromSnippet.Transcode(Resources.MkvWithSubtitles, output, videoCodec, audioCodec, subtitleCodec)).Start(); IMediaInfo mediaInfo = await FFmpeg.GetMediaInfo(output); Assert.Equal(TimeSpan.FromSeconds(9), mediaInfo.Duration); Assert.Single(mediaInfo.VideoStreams); Assert.Single(mediaInfo.AudioStreams); Assert.Empty(mediaInfo.SubtitleStreams); IAudioStream audioStream = mediaInfo.AudioStreams.First(); IVideoStream videoStream = mediaInfo.VideoStreams.First(); Assert.NotNull(videoStream); Assert.NotNull(audioStream); Assert.Equal(videoCodec.ToString(), videoStream.Codec); Assert.Equal(audioCodec.ToString(), audioStream.Codec); Assert.Equal(25, videoStream.Framerate); }
/// <inheritdoc /> public IConversion SetAudio(AudioCodec codec, AudioQuality bitrate) { return(SetAudio(codec.ToString(), bitrate)); }
internal static string Audio(AudioCodec codec, AudioQuality bitrate) { return($"-codec:a {codec.ToString().ToLower()} -b:a {(int) bitrate}k -strict experimental "); }
internal static string Audio(AudioCodec codec) { return($"-codec:a {codec.ToString().ToLower()} "); }