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;
}
}
}