C#FFmpeg命令实现库 > ffmpeg返回的视频信息


ffmpeg返回的视频信息反序列化


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

namespace FFmpegLib
{
    /// <summary>
    /// ffmpeg返回的视频信息
    /// </summary>
    public class VideoInfo
    {
        /// <summary>
        /// 被解析的源文件信息
        /// </summary>
        public FileInfo Source { get; }
        /// <summary>
        /// 视频的时长
        /// </summary>
        public TimeSpan Duration { get; set; }
        /// <summary>
        /// 音频格式
        /// </summary>
        public string AudioFormats { get; set; }
        /// <summary>
        /// 视频格式
        /// </summary>
        public string VideoFormats { get; set; }
        /// <summary>
        /// 视频的宽高比
        /// </summary>
        public string Display { get; set; }
        /// <summary>
        /// 帧率
        /// </summary>
        public string Frame { get; set; }
        /// <summary>
        ///
        /// </summary>
        public int Height { get; set; }
        /// <summary>
        ///
        /// </summary>
        public int Width { get; set; }
        /// <summary>
        /// 解析指定的文件
        /// </summary>
        /// <param name="fileInfo"></param>
        /// <exception cref="ArgumentNullException"></exception>
        public VideoInfo(FileInfo fileInfo)
        {
            SourceFile = fileInfo ?? throw new ArgumentNullException(nameof(fileInfo));
        }
        /// <summary>
        /// 修改默认的
        /// </summary>
        /// <returns></returns>
        public override string ToString() => $"{SourceFile.Name} {VideoFormat} {AudioFormat} {FrameRate} w:{Width} h:{Height} {Duration}";
    }
    /// <summary>
    /// ffmpeg的控制台命令基础进程管理类
    /// </summary>
    public class FFCmdBase : IDisposable
    {
        /// <summary>
        /// ffmpeg的当前使用的exe的完整路径
        /// </summary>
        protected readonly string FFprobeExePath;
        protected readonly string FFmpegExePath;
        /// <summary>
        /// 当前正在运行中的程序
        /// </summary>
        protected Process WorkFFmpegProc;
        /// <summary>
        /// 表示当前是否正在运行
        /// </summary>
        public bool IsWorking => WorkingFFmpegProc != null && !(WorkingFFmpegProc.HasExited || Process.GetProcesses().All((Process x) => x.Id != WorkingFFmpegProc.Id));
        /// <summary>
        /// 创建一个ffmpeg进程
        /// </summary>
        /// <param name="ffmpegdir">ffmpeg的bin文件夹的完整路径</param>
        protected FFCmdBase(string ffmpegdir)
        {
            string arg = Environment.Is64BitProcess ? "x64" : "x86";
            FFprobeExePath = $"{ffmpegdir.TrimEnd('\\')}\\FFMPEG\\bin\\{arg}\\ffprobe.exe";
            FFmpegExePath = $"{ffmpegdir.TrimEnd('\\')}\\FFMPEG\\bin\\{arg}\\ffmpeg.exe";
        }
        /// <summary>
        /// 释放当前对象
        /// </summary>
        public void Dispose()
        {
            WorkingFFmpegProc?.Kill();
            WorkingFFmpegProc?.Dispose();
            WorkingFFmpegProc = null;
        }
        /// <summary>
        /// 创建一个新的ffmpeg进程
        /// </summary>
        /// <param name="args"></param>
        /// <param name="processPath"></param>
        /// <param name="rStandardInput"></param>
        /// <param name="rStandardOutput"></param>
        /// <param name="rStandardError"></param>
        /// <exception cref="InvalidOperationException"></exception>
        protected void CreateProc(string args, string processPath, bool rStandardInput = false, bool rStandardOutput = false, bool rStandardError = false)
        {
            if (IsWorking) throw new InvalidOperationException("进程正在执行,请等待当前操作完成!");
            WorkingFFmpegProc = new Process();
            WorkingFFmpegProc.StartInfo.FileName = processPath;
            WorkingFFmpegProc.StartInfo.Arguments = args;
            WorkingFFmpegProc.StartInfo.UseShellExecute = false;
            WorkingFFmpegProc.StartInfo.CreateNoWindow = true;
            WorkingFFmpegProc.StartInfo.RedirectStandardInput = rStandardInput;
            WorkingFFmpegProc.StartInfo.RedirectStandardOutput = rStandardOutput;
            WorkingFFmpegProc.StartInfo.RedirectStandardError = rStandardError;
        }
        /// <summary>
        /// 强制关闭进程
        /// </summary>
        public void Kill()
        {
            WorkingFFmpegProc?.Kill();
            WorkingFFmpegProc = null;
        }
    }
}