Пример #1
0
        /// <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));
            });
        }
Пример #2
0
        /// <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));
        }
Пример #3
0
        /// <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}"));
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
 /// <inheritdoc />
 public IConversion SetAudio(AudioCodec codec, AudioQuality bitrate)
 {
     return(SetAudio(codec.ToString(), bitrate));
 }
Пример #8
0
 internal static string Audio(AudioCodec codec, AudioQuality bitrate)
 {
     return($"-codec:a {codec.ToString().ToLower()} -b:a {(int) bitrate}k -strict experimental ");
 }
Пример #9
0
 internal static string Audio(AudioCodec codec)
 {
     return($"-codec:a {codec.ToString().ToLower()} ");
 }