C#FFmpeg命令实现库 > ffprobe.exe的相关命令


ffprobe.exe的相关命令实现类


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FFmpegLib
{
    /// <summary>
    /// ffprobe.exe的相关命令
    /// </summary>
    public class FFProbe : FFCmdBase
    {
        /// <summary>
        /// 创建一个ffprobecmd命令
        /// </summary>
        public FFProbe() : base(Environment.CurrentDirectory)
        {
        }
        /// <summary>
        /// 解析指定文件的video信息
        /// </summary>
        /// <param name="fileinfo"></param>
        /// <returns></returns>
        public VideoInfo GetVideoInfo(FileInfo fileinfo)
        {
            fileinfo.Refresh();
            var vinfo = new VideoInfo(fileinfo);
            string text = RunProbeExeProcess($"-v quiet -print_format json -show_streams \"{fileinfo.FullName}\"");
            var fst = FFStreams.Parse(text);
            if (fst.VideoStream.FirstOrDefault() is IFFVideoStream vst)
            {//获取视频信息
                vinfo.Duration = TimeSpan.FromSeconds(double.Parse(vst.Duration));
                vinfo.Width = vst.Width;
                vinfo.Height = vst.Height;
                vinfo.DisplayRatio = vst.DisplayAspectRatio;
                vinfo.VideoFormat = vst.CodecLongName;
                vinfo.FrameRate = vst.RFrameRate;
            }
            if(fst.AudioStream.FirstOrDefault() is IFFAudioStream audio)
            {//获取音频信息
                vinfo.AudioFormat = audio.CodecLongName;
            }
            return vinfo;
        }
        /// <summary>
        /// 使用参数启动一个probe线程
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        private string RunProbeExeProc(string args)
        {
            CreateProcess(args, FFprobeExePath, rStandardInput: false, rStandardOutput: true);
            try
            {
                this.WorkingFFmpegProc.Start();
                return WorkingFFmpegProc.StandardOutput.ReadToEnd();
            }
            catch (Exception)
            {
                return "";
            }
            finally
            {
                WorkingFFmpegProc.WaitForExit();
                WorkingFFmpegProc.Close();
                WorkingFFmpegProc.Dispose();
                WorkingFFmpegProc = null;
            }
        }
    }
}