Exemplo n.º 1
0
        /// <summary>
        /// Convert the input video using the specified options.
        ///
        /// Note:
        /// h.264 and .mp4 have timing/cutting issues. h.264 only cuts on the last keyframe,
        /// which could be several seconds before the time that you actually want to cut.
        ///
        /// When cutting an .mp4 (even with MPEG4 video and MP3 audio), the cut will take place
        /// ~0.5 seconds before it should.
        ///
        /// (Is this still true?)
        /// </summary>
        public static void convertVideo(string inFile, string audioStream, DateTime startTime, DateTime endTime,
                                        ImageSize size, ImageCrop crop, int bitrateVideo, int bitrateAudio, VideoCodec videoCodec,
                                        AudioCodec audioCodec,
                                        Profilex264 profile, Presetx264 preset, string outFile, DialogProgress dialogProgress)
        {
            string videoMapArg = formatVideoMapArg();
            string audioMapArg = formatAudioMapArg(audioStream);

            string videoCodecArg = formatVideoCodecArg(videoCodec);

            string presetArg          = formatPresetFileArg(preset);
            string keyframeOptionsArg = formatKeyframeOptionsArg(videoCodec);
            string profileArg         = formatProfileFileArg(profile);

            string videoSizeArg    = formatVideoSizeArg(inFile, size, crop, 16, 2);
            string videoBitrateArg = $"-b:v {bitrateVideo}k";

            string audioCodecArg   = formatAudioCodecArg(audioCodec);
            string audioBitrateArg = formatAudioBitrateArg(bitrateAudio);

            string timeArg = formatStartTimeAndDurationArg(startTime, endTime);

            string cropArg = formatCropArg(inFile, size, crop);

            string threadsArg = "-threads 0";

            string ffmpegConvertArgs = "";

            // Good ffmpeg resource: http://howto-pages.org/ffmpeg/
            // 0:0 is assumed to be the video stream
            // Audio stream: 0:n where n is the number of the audio stream (usually 1)
            //
            // Example format:
            // -y -i "G:\Temp\input.mkv" -ac 2 -map 0:v:0 -map 0:a:0 -codec:v libx264 -preset superfast -g 6 -keyint_min 6
            // -fpre "E:\subs2srs\subs2srs\bin\Release\Utils\ffmpeg\presets\libx264-ipod640.ffpreset"
            // -b:v 800k -codec:a aac -b:a 128k -ss 00:03:32.420 -t 00:02:03.650 -vf "scale 352:202, crop=352:202:0:0" -threads 0
            // "C:\Documents and Settings\cb4960\Local Settings\Temp\~subs2srs_temp.mp4"
            ffmpegConvertArgs =
                $"-y -i \"{inFile}\" -ac 2 {videoMapArg} {audioMapArg} {videoCodecArg} {presetArg} {keyframeOptionsArg} {profileArg} {videoBitrateArg} {audioCodecArg} {audioBitrateArg}" +
                $" {timeArg} -vf \"{videoSizeArg}, {cropArg}\" {threadsArg} \"{outFile}\" "; // {14}


            if (dialogProgress == null)
            {
                UtilsCommon.startFFmpeg(ffmpegConvertArgs, true, true);
            }
            else
            {
                UtilsCommon.startFFmpegProgress(ffmpegConvertArgs, dialogProgress);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Format a x264 preset argument for ffmpeg.
        /// Note: The options for -profile can be found here:
        /// http://www.linuxcertif.com/man/1/x264/
        /// </summary>
        public static string formatPresetFileArg(Presetx264 preset)
        {
            string preseteArg = "";
            string presetText = "";

            switch (preset)
            {
            case Presetx264.UltraFast: presetText = "ultrafast"; break;

            case Presetx264.SuperFast: presetText = "superfast"; break;

            case Presetx264.VeryFast: presetText = "veryfast"; break;

            case Presetx264.Faster: presetText = "faster"; break;

            case Presetx264.Fast: presetText = "fast"; break;

            case Presetx264.Medium: presetText = "medium"; break;

            case Presetx264.Slow: presetText = "slow"; break;

            case Presetx264.Slower: presetText = "slower"; break;

            case Presetx264.VerySlow: presetText = "veryslow"; break;

            case Presetx264.Placebo: presetText = "placebo"; break;

            case Presetx264.None: presetText = ""; break;

            default: presetText = ""; break;
            }

            if (presetText.Length > 0)
            {
                // Example: -preset superfast
                preseteArg = String.Format("-preset {0}", presetText);
            }

            return(preseteArg);
        }