Esempio n. 1
0
        /// <summary>
        /// Validates the supplied FQPN to ensure it is a ffmpeg utility.
        /// If checks pass, global variable FFmpegPath and EncoderLocation are updated.
        /// </summary>
        /// <param name="path">FQPN to test.</param>
        /// <param name="location">Location (External, Custom, System) of tool.</param>
        /// <returns><c>true</c> if the version validation succeeded; otherwise, <c>false</c>.</returns>
        private bool ValidatePath(string path, FFmpegLocation location)
        {
            bool rc = false;

            if (!string.IsNullOrEmpty(path))
            {
                if (File.Exists(path))
                {
                    rc = new EncoderValidator(_logger, path).ValidateVersion();

                    if (!rc)
                    {
                        _logger.LogWarning("FFmpeg: {Location}: Failed version check: {Path}", location, path);
                    }

                    _ffmpegPath     = path;
                    EncoderLocation = location;
                }
                else
                {
                    _logger.LogWarning("FFmpeg: {Location}: File not found: {Path}", location, path);
                }
            }

            return(rc);
        }
Esempio n. 2
0
        /// <summary>
        /// Validates the supplied FQPN to ensure it is a ffmpeg utility.
        /// If checks pass, global variable FFmpegPath and EncoderLocation are updated.
        /// </summary>
        /// <param name="path">FQPN to test</param>
        /// <param name="location">Location (External, Custom, System) of tool</param>
        /// <returns></returns>
        private bool ValidatePath(string path, FFmpegLocation location)
        {
            bool rc = false;

            if (!string.IsNullOrEmpty(path))
            {
                if (File.Exists(path))
                {
                    rc = new EncoderValidator(_logger, _processFactory).ValidateVersion(path, true);

                    if (!rc)
                    {
                        _logger.LogWarning("FFmpeg: {0}: Failed version check: {1}", location.ToString(), path);
                    }

                    // ToDo - Enable the ffmpeg validator.  At the moment any version can be used.
                    rc = true;

                    FFmpegPath      = path;
                    EncoderLocation = location;
                }
                else
                {
                    _logger.LogWarning("FFmpeg: {0}: File not found: {1}", location.ToString(), path);
                }
            }

            return(rc);
        }
Esempio n. 3
0
        /// <summary>
        /// Run at startup or if the user removes a Custom path from transcode page.
        /// Sets global variables FFmpegPath.
        /// Precedence is: Config > CLI > $PATH
        /// </summary>
        public void SetFFmpegPath()
        {
            // ToDo - Finalise removal of the --ffprobe switch
            if (!string.IsNullOrEmpty(StartupOptionFFprobePath))
            {
                _logger.LogWarning("--ffprobe switch is deprecated and shall be removed in the next release");
            }

            // 1) Custom path stored in config/encoding xml file under tag <EncoderAppPath> takes precedence
            if (!ValidatePath(ConfigurationManager.GetConfiguration <EncodingOptions>("encoding").EncoderAppPath, FFmpegLocation.Custom))
            {
                // 2) Check if the --ffmpeg CLI switch has been given
                if (!ValidatePath(StartupOptionFFmpegPath, FFmpegLocation.SetByArgument))
                {
                    // 3) Search system $PATH environment variable for valid FFmpeg
                    if (!ValidatePath(ExistsOnSystemPath("ffmpeg"), FFmpegLocation.System))
                    {
                        EncoderLocation = FFmpegLocation.NotFound;
                        FFmpegPath      = null;
                    }
                }
            }

            // Write the FFmpeg path to the config/encoding.xml file as <EncoderAppPathDisplay> so it appears in UI
            var config = ConfigurationManager.GetConfiguration <EncodingOptions>("encoding");

            config.EncoderAppPathDisplay = FFmpegPath ?? string.Empty;
            ConfigurationManager.SaveConfiguration("encoding", config);

            // Only if mpeg path is set, try and set path to probe
            if (FFmpegPath != null)
            {
                // Determine a probe path from the mpeg path
                FFprobePath = Regex.Replace(FFmpegPath, @"[^\/\\]+?(\.[^\/\\\n.]+)?$", @"ffprobe$1");

                // Interrogate to understand what coders are supported
                var result = new EncoderValidator(_logger, _processFactory).GetAvailableCoders(FFmpegPath);

                SetAvailableDecoders(result.decoders);
                SetAvailableEncoders(result.encoders);
            }

            _logger.LogInformation("FFmpeg: {0}: {1}", EncoderLocation.ToString(), FFmpegPath ?? string.Empty);
        }
Esempio n. 4
0
        /// <summary>
        /// Run at startup or if the user removes a Custom path from transcode page.
        /// Sets global variables FFmpegPath.
        /// Precedence is: Config > CLI > $PATH.
        /// </summary>
        public void SetFFmpegPath()
        {
            // 1) Custom path stored in config/encoding xml file under tag <EncoderAppPath> takes precedence
            if (!ValidatePath(_configurationManager.GetEncodingOptions().EncoderAppPath, FFmpegLocation.Custom))
            {
                // 2) Check if the --ffmpeg CLI switch has been given
                if (!ValidatePath(_startupOptionFFmpegPath, FFmpegLocation.SetByArgument))
                {
                    // 3) Search system $PATH environment variable for valid FFmpeg
                    if (!ValidatePath(ExistsOnSystemPath("ffmpeg"), FFmpegLocation.System))
                    {
                        EncoderLocation = FFmpegLocation.NotFound;
                        _ffmpegPath     = null;
                    }
                }
            }

            // Write the FFmpeg path to the config/encoding.xml file as <EncoderAppPathDisplay> so it appears in UI
            var config = _configurationManager.GetEncodingOptions();

            config.EncoderAppPathDisplay = _ffmpegPath ?? string.Empty;
            _configurationManager.SaveConfiguration("encoding", config);

            // Only if mpeg path is set, try and set path to probe
            if (_ffmpegPath != null)
            {
                // Determine a probe path from the mpeg path
                _ffprobePath = Regex.Replace(_ffmpegPath, @"[^\/\\]+?(\.[^\/\\\n.]+)?$", @"ffprobe$1");

                // Interrogate to understand what coders are supported
                var validator = new EncoderValidator(_logger, _ffmpegPath);

                SetAvailableDecoders(validator.GetDecoders());
                SetAvailableEncoders(validator.GetEncoders());
                SetAvailableHwaccels(validator.GetHwaccels());
                threads = EncodingHelper.GetNumberOfThreads(null, _configurationManager.GetEncodingOptions(), null);
            }

            _logger.LogInformation("FFmpeg: {EncoderLocation}: {FfmpegPath}", EncoderLocation, _ffmpegPath ?? string.Empty);
        }