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