Exemplo n.º 1
0
        /// <summary>
        /// Convert a video do a different format.
        /// </summary>
        /// <param name="source">Input video source.</param>
        /// <param name="output">Output information.</param>
        /// <param name="type">Target conversion video type.</param>
        /// <param name="speed">Conversion target speed/quality (faster speed = lower quality).</param>
        /// <param name="size">Video size.</param>
        /// <param name="audioQuality">Conversion target audio quality.</param>
        /// <param name="multithreaded">Is encoding multithreaded.</param>
        /// <returns>Output video information.</returns>
        public VideoInfo Convert(
            VideoInfo source,
            FileInfo output,
            VideoType type = VideoType.Mp4,
            Speed speed    =
            Speed.SuperFast,
            VideoSize size =
            VideoSize.Original,
            AudioQuality audioQuality = AudioQuality.Normal,
            bool multithreaded        = false)
        {
            FFMpegHelper.ConversionExceptionCheck(source.ToFileInfo(), output);
            FFMpegHelper.ExtensionExceptionCheck(output, FileExtension.ForType(type));
            FFMpegHelper.ConversionSizeExceptionCheck(source);

            string args = "";

            var height = source.Height * (source.Width / (int)size);

            switch (type)
            {
            case VideoType.Mp4:
                args = Arguments.Input(source) +
                       Arguments.Threads(multithreaded) +
                       Arguments.Scale(size, height) +
                       Arguments.Video(VideoCodec.LibX264, 2400) +
                       Arguments.Speed(speed) +
                       Arguments.Audio(AudioCodec.Aac, audioQuality) +
                       Arguments.Output(output);
                break;

            case VideoType.Ogv:
                args = Arguments.Input(source) +
                       Arguments.Threads(multithreaded) +
                       Arguments.Scale(size, height) +
                       Arguments.Video(VideoCodec.LibTheora, 2400) +
                       Arguments.Speed(16) +
                       Arguments.Audio(AudioCodec.LibVorbis, audioQuality) +
                       Arguments.Output(output);
                break;

            case VideoType.Ts:
                args = Arguments.Input(source) +
                       Arguments.Copy() +
                       Arguments.BitStreamFilter(Channel.Video, Filter.H264_Mp4ToAnnexB) +
                       Arguments.ForceFormat(VideoCodec.MpegTs) +
                       Arguments.Output(output);
                break;
            }

            if (!RunProcess(args, output))
            {
                throw new FFMpegException(FFMpegExceptionType.Conversion, $"The video could not be converted to {Enum.GetName(typeof(VideoType), type)}");
            }

            return(new VideoInfo(output));
        }
Exemplo n.º 2
0
        /// <summary>
        ///     Adds audio to a video file.
        /// </summary>
        /// <param name="source">Source video file.</param>
        /// <param name="audio">Source audio file.</param>
        /// <param name="output">Output video file.</param>
        /// <param name="stopAtShortest">Indicates if the encoding should stop at the shortest input file.</param>
        /// <returns>Success state</returns>
        public bool ReplaceAudio(VideoInfo source, FileInfo audio, FileInfo output, bool stopAtShortest = false)
        {
            FfMpegHelper.ConversionExceptionCheck(source, output);
            FfMpegHelper.InputFilesExistExceptionCheck(audio);
            FfMpegHelper.ExtensionExceptionCheck(output, source.Extension);

            var args = Arguments.Input(source) +
                       Arguments.Input(audio) +
                       Arguments.Copy(Channel.Video) +
                       Arguments.Audio(AudioCodec.Aac, AudioQuality.Hd) +
                       Arguments.FinalizeAtShortestInput() +
                       Arguments.Output(output);

            return(RunProcess(args, output));
        }
Exemplo n.º 3
0
        /// <summary>
        ///     Adds a poster image to an audio file.
        /// </summary>
        /// <param name="image">Source image file.</param>
        /// <param name="audio">Source audio file.</param>
        /// <param name="output">Output video file.</param>
        /// <returns></returns>
        public bool PosterWithAudio(FileInfo image, FileInfo audio, FileInfo output)
        {
            FfMpegHelper.InputFilesExistExceptionCheck(image, audio);
            FfMpegHelper.ExtensionExceptionCheck(output, FfMpegHelper.Extensions.Mp4);

            var args = Arguments.Loop(1) +
                       Arguments.Input(image) +
                       Arguments.Input(audio) +
                       Arguments.Video(VideoCodec.LibX264, 2400) +
                       Arguments.Audio(AudioCodec.Aac, AudioQuality.Normal) +
                       Arguments.FinalizeAtShortestInput() +
                       Arguments.Output(output);

            return(RunProcess(args, output));
        }
Exemplo n.º 4
0
        /// <summary>
        ///     Converts a source video to WebM format.
        /// </summary>
        /// <param name="source">Source video file.</param>
        /// <param name="output">Output video file.</param>
        /// <param name="size">Output video size.</param>
        /// <param name="aQuality">Output audio quality.</param>
        /// <returns>Success state.</returns>
        public bool ToWebM(VideoInfo source, FileInfo output, VideoSize size = VideoSize.Original,
                           AudioQuality aQuality = AudioQuality.Normal)
        {
            _totalTime = source.Duration;

            FfMpegHelper.ConversionExceptionCheck(source, output);
            FfMpegHelper.ExtensionExceptionCheck(output, FfMpegHelper.Extensions.WebM);

            var conversionArgs = Arguments.Input(source) +
                                 Arguments.Scale(size) +
                                 Arguments.Video(VideoCodec.LibVpx, 2400) +
                                 Arguments.Speed(16) +
                                 Arguments.Audio(AudioCodec.LibVorbis, aQuality) +
                                 Arguments.Output(output);

            return(RunProcess(conversionArgs, output));
        }
Exemplo n.º 5
0
        /// <summary>
        ///     Converts a source video to MP4 format.
        /// </summary>
        /// <param name="source">Source video file.</param>
        /// <param name="output">Output video file.</param>
        /// <param name="speed">Conversion speed preset.</param>
        /// <param name="size">Output video size.</param>
        /// <param name="aQuality">Output audio quality.</param>
        /// <param name="multithread">Use multithreading for conversion.</param>
        /// <returns>Success state.</returns>
        public bool ToMp4(VideoInfo source, FileInfo output, Speed speed = Speed.SuperFast,
                          VideoSize size = VideoSize.Original, AudioQuality aQuality = AudioQuality.Normal, bool multithread = false)
        {
            _totalTime = source.Duration;

            FfMpegHelper.ConversionExceptionCheck(source, output);
            FfMpegHelper.ExtensionExceptionCheck(output, FfMpegHelper.Extensions.Mp4);

            var conversionArgs = Arguments.Input(source) +
                                 Arguments.Threads(multithread) +
                                 Arguments.Scale(size) +
                                 Arguments.Video(VideoCodec.LibX264, 2400) +
                                 Arguments.Speed(speed) +
                                 Arguments.Audio(AudioCodec.Aac, aQuality) +
                                 Arguments.Output(output);

            return(RunProcess(conversionArgs, output));
        }
Exemplo n.º 6
0
        /// <summary>
        ///     Converts a source video to OGV format.
        /// </summary>
        /// <param name="source">Source video file.</param>
        /// <param name="output">Output video file.</param>
        /// <param name="size">Output video size.</param>
        /// <param name="aQuality">Output audio quality.</param>
        /// <param name="multithread">Use multithreading for conversion.</param>
        /// <returns>Success state.</returns>
        public bool ToOgv(VideoInfo source, FileInfo output, VideoSize size = VideoSize.Original,
                          AudioQuality aQuality = AudioQuality.Normal, bool multithread = false)
        {
            _totalTime = source.Duration;

            FfMpegHelper.ConversionExceptionCheck(source, output);
            FfMpegHelper.ExtensionExceptionCheck(output, FfMpegHelper.Extensions.Ogv);

            var newHeight = source.Height * (source.Width / (int)size);

            var conversionArgs = Arguments.Input(source) +
                                 Arguments.Threads(multithread) +
                                 Arguments.Scale(size, newHeight) +
                                 Arguments.Video(VideoCodec.LibTheora, 2400) +
                                 Arguments.Speed(16) +
                                 Arguments.Audio(AudioCodec.LibVorbis, aQuality) +
                                 Arguments.Output(output);

            return(RunProcess(conversionArgs, output));
        }
Exemplo n.º 7
0
        /// <summary>
        ///     Adds audio to a video file.
        /// </summary>
        /// <param name="source">Source video file.</param>
        /// <param name="audio">Source audio file.</param>
        /// <param name="output">Output video file.</param>
        /// <param name="stopAtShortest">Indicates if the encoding should stop at the shortest input file.</param>
        /// <returns>Success state</returns>
        public VideoInfo ReplaceAudio(VideoInfo source, FileInfo audio, FileInfo output, bool stopAtShortest = false)
        {
            FFMpegHelper.ConversionExceptionCheck(source.ToFileInfo(), output);
            FFMpegHelper.InputsExistExceptionCheck(audio);
            FFMpegHelper.ConversionSizeExceptionCheck(source);
            FFMpegHelper.ExtensionExceptionCheck(output, source.Extension);

            var args = Arguments.Input(source) +
                       Arguments.Input(audio) +
                       Arguments.Copy(Channel.Video) +
                       Arguments.Audio(AudioCodec.Aac, AudioQuality.Hd) +
                       Arguments.FinalizeAtShortestInput(stopAtShortest) +
                       Arguments.Output(output);

            if (!RunProcess(args, output))
            {
                throw new FFMpegException(FFMpegExceptionType.Operation, "Could not replace the video audio.");
            }

            return(new VideoInfo(output));
        }
Exemplo n.º 8
0
        /// <summary>
        ///     Adds a poster image to an audio file.
        /// </summary>
        /// <param name="image">Source image file.</param>
        /// <param name="audio">Source audio file.</param>
        /// <param name="output">Output video file.</param>
        /// <returns></returns>
        public VideoInfo PosterWithAudio(FileInfo image, FileInfo audio, FileInfo output)
        {
            FFMpegHelper.InputsExistExceptionCheck(image, audio);
            FFMpegHelper.ExtensionExceptionCheck(output, FileExtension.Mp4);
            FFMpegHelper.ConversionSizeExceptionCheck(Image.FromFile(image.FullName));

            var args = Arguments.Loop(1) +
                       Arguments.Input(image) +
                       Arguments.Input(audio) +
                       Arguments.Video(VideoCodec.LibX264, 2400) +
                       Arguments.Audio(AudioCodec.Aac, AudioQuality.Normal) +
                       Arguments.FinalizeAtShortestInput(true) +
                       Arguments.Output(output);

            if (!RunProcess(args, output))
            {
                throw new FFMpegException(FFMpegExceptionType.Operation, "An error occured while adding the audio file to the image.");
            }

            return(new VideoInfo(output));
        }