| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 | using MediaBrowser.Common.Configuration;using MediaBrowser.Common.Extensions;using MediaBrowser.Model.Logging;using System;using System.Diagnostics;using System.Globalization;using System.IO;using System.Text;using MediaBrowser.Common.IO;using System.Collections.Generic;using CommonIO;namespace MediaBrowser.Server.Startup.Common.FFMpeg{    public class FFmpegValidator    {        private readonly ILogger _logger;        private readonly IApplicationPaths _appPaths;        private readonly IFileSystem _fileSystem;        public FFmpegValidator(ILogger logger, IApplicationPaths appPaths, IFileSystem fileSystem)        {            _logger = logger;            _appPaths = appPaths;            _fileSystem = fileSystem;        }        public Tuple<List<string>,List<string>> Validate(FFMpegInfo info)        {            _logger.Info("FFMpeg: {0}", info.EncoderPath);            _logger.Info("FFProbe: {0}", info.ProbePath);            var decoders = GetDecoders(info.EncoderPath);            var encoders = GetEncoders(info.EncoderPath);            return new Tuple<List<string>, List<string>>(decoders, encoders);        }        private List<string> GetDecoders(string ffmpegPath)        {            string output = string.Empty;            try            {                output = GetFFMpegOutput(ffmpegPath, "-decoders");            }            catch            {            }            var found = new List<string>();            var required = new[]            {                "h264_qsv",                "mpeg2_qsv",                "vc1_qsv"            };            foreach (var codec in required)            {                var srch = " " + codec + "  ";                if (output.IndexOf(srch, StringComparison.OrdinalIgnoreCase) == -1)                {                    _logger.Warn("ffmpeg is missing decoder " + codec);                }                else                {                    found.Add(codec);                }            }            return found;        }        private List<string> GetEncoders(string ffmpegPath)        {            string output = null;            try            {                output = GetFFMpegOutput(ffmpegPath, "-encoders");            }            catch            {            }            var found = new List<string>();            var required = new[]            {                "libx264",                "libx265",                "mpeg4",                "msmpeg4",                //"libvpx",                //"libvpx-vp9",                "aac",                "ac3",                "libmp3lame",                //"libvorbis",                "srt"            };            foreach (var codec in required)            {                var srch = " " + codec + "  ";                if (output.IndexOf(srch, StringComparison.OrdinalIgnoreCase) == -1)                {                    _logger.Warn("ffmpeg is missing encoder " + codec);                }                else                {                    found.Add(codec);                }            }            return found;        }        private string GetFFMpegOutput(string path, string arguments)        {            var process = new Process            {                StartInfo = new ProcessStartInfo                {                    CreateNoWindow = true,                    UseShellExecute = false,                    FileName = path,                    Arguments = arguments,                    WindowStyle = ProcessWindowStyle.Hidden,                    ErrorDialog = false,                    RedirectStandardOutput = true,                    RedirectStandardError = true                }            };            using (process)            {                process.Start();                try                {                    process.BeginErrorReadLine();                    using (var reader = new StreamReader(process.StandardOutput.BaseStream))                    {                        return reader.ReadToEnd();                    }                }                catch                {                    // Hate having to do this                    try                    {                        process.Kill();                    }                    catch (Exception ex1)                    {                        _logger.ErrorException("Error killing ffmpeg", ex1);                    }                    throw;                }            }        }    }}
 |