我们先创建 合成指令参数的和创建进程任务的类
FFmpegFactory
using System;
using System.Diagnostics;
namespace FFmpegProc
{
public class FFmpegFactory{
/// <summary>
/// 生成录制摄像头的命令
/// </summary>
/// <param name="camera">摄像头名字</param>
/// <param name="in_size">使用的分辨率</param>
/// <param name="autolen">指定时长,结束后自动停止</param>
/// <param name="audio">麦克风的名字</param>
/// <param name="type">文件类型</param>
/// <param name="timetag">是否添加时间标签</param>
/// <param name="fixttitl">添加文字标签</param>
/// <param name="out_size">输出的视频尺寸</param>
/// <param name="savepath">文件保存路径</param>
public static string GetCmdOfCamera(string camera, string in_size, int autolen, string audio, SaveFileType type, bool timetag, string fixttitl, string out_size, string savepath)
{
string cmd = "-f dshow";
if (!string.IsNullOrWhiteSpace(in_size))
{
cmd += " -s " + in_size;
}
cmd += " -i video=\"" + camera + "\" -vcodec " + FFmpegManager.Vcodec;//h264 libx264";
if (!string.IsNullOrWhiteSpace(audio))
{
cmd += " -f dshow -i audio=\"" + audio + "\" -acodec " + FFmpegManager.Acodec;// aac -strict -2";
}
if (autolen > 0)
{
cmd += " -t " + autolen;
}
if (timetag)
{
cmd += " -vf drawtext=\"fontfile = arial.ttf:x = w - tw:fontcolor = red:fontsize = 35:text = '" + fixttitl + " %{localtime\\:%Y-%m-%d %H\\\\\\:%M\\\\\\:%S}'\"";
}
if (type != SaveFileType.none)
{
cmd += " -f " + type.ToString();
}
if (!string.IsNullOrWhiteSpace(out_size))
{
cmd += " -s " + out_size;
}
cmd += " -y \"" + savepath + "\"";
return cmd;
}
}
}
其中 SaveFileType 枚举有
public enum SaveFileType
{
none,
mp4,
avi,
mkv,
mp3,
wav,
aac
}
添加创建进程的任务
/// <summary>
///
/// </summary>
/// <param name="ffmpegdir">ffmpeg的路径</param>
/// <param name="threads">CPU数</param>
/// <param name="no">任务编号</param>
/// <param name="cmd">命令字符串</param>
/// <returns></returns>
public static RecordTask Create(string ffmpegdir, string threads, string no, string cmd)
{
string ffmpeg = "ffmpegr.exe";
if (!string.IsNullOrEmpty(ffmpegdir))
{
ffmpeg = ffmpegdir + ffmpeg;
}
if (!string.IsNullOrWhiteSpace(threads) && threads != "0")
{
cmd = "-threads " + threads + " " + cmd;
}
RecordTask task = new RecordTask(no);
var process = new Process();
process.StartInfo.WorkingDirectory = Environment.CurrentDirectory;
process.StartInfo.FileName = ffmpeg;
process.StartInfo.Arguments = cmd;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardInput = true;
task.Handle = process;
return task;
}
录制任务实体类 RecordTask 主要是记录进程的开始时间,运行状态,结束时间
using System;
using System.Diagnostics;
namespace FFmpegProc
{
public class RecordTask
{
public RecordTask(string no)
{
RFile = new RecordFile();
CreateTime = DateTime.Now;
No = no;
}
/// <summary>
/// 任务编号
/// </summary>
public string No { get; private set; }
/// <summary>
/// ffmpeg的句柄ID
/// </summary>
public int Pid { get; private set; }
/// <summary>
/// ffmpeg的句柄
/// </summary>
public Process Handle { get; set; }
/// <summary>
/// 录制的文件信息
/// </summary>
public RecordFile RFile { get; private set; }
/// <summary>
/// 任务创建时间
/// </summary>
public DateTime CreateTime { get; private set; }
/// <summary>
/// 是否是自动停止录制的任务
/// </summary>
public bool AutoEndTask { get; set; }
/// <summary>
/// 自动结束时间
/// </summary>
public DateTime AutoEndTime { get; set; }
/// <summary>
/// 任务状态
/// </summary>
public TaskStatus TStatus { get; set; }
/// <summary>
/// 等待停止的就绪时间
/// </summary>
public DateTime WaitEndRecord { get; private set; }
/// <summary>
/// 任务结束的时间
/// </summary>
public DateTime TaskFinishTime { get; private set; }
/// <summary>
/// 任务开始的时间
/// </summary>
public DateTime TaskStartime { get; private set; }
/// <summary>
/// FFmpeg 发起退出的时间
/// </summary>
public DateTime FFmpegQuitTime { get; set; }
/// <summary>
/// 设置为结束状态
/// </summary>
public void SetFinishTask()
{
TaskFinishTime = DateTime.Now;
RFile.EndTime = TaskFinishTime;
TStatus = TaskStatus.FFmpegFinish;
}
/// <summary>
/// 设置任务准备结束的时长
/// </summary>
/// <param name="second"></param>
public void SetWaitExitWithTardy(int second)
{
WaitEndRecord = DateTime.Now.AddSeconds(second);
TStatus = TaskStatus.AlreadyNoticeTaskToExit;
}
/// <summary>
/// 设置进程的PID值
/// </summary>
/// <param name="pid"></param>
public void SetPid(int pid)
{
TaskStartime = DateTime.Now;
RFile.StartTime = TaskStartime;
Pid = pid;
}
}
}
录制的文件的实体类 RecordFile
using System;
namespace FFmpegProc
{
public class RecordFile
{
public int Size { get; set; }
public int TotalSecond { get; set; }
public string Duration { get; set; }
public string FileName { get; set; }
public string FileDir { get; set; }
/// <summary>
/// 文件储存路径
/// </summary>
public string FilePath { get; set; }
/// <summary>
/// 开始录制时间
/// </summary>
public DateTime StartTime { get; set; }
/// <summary>
/// 最大视频时长秒
/// </summary>
public int VideoMaxLen { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public DateTime EndTime { get; set; }
/// <summary>
/// 判断文件录制是否超时预期的最大时长
/// </summary>
/// <returns></returns>
public bool IsMaxOver()
{
return StartTime.AddSeconds(VideoMaxLen) < DateTime.Now;
}
}
}
以上完成了 创建一个辅助合成指令的类 和 一个录制任务的实体类
下一章 是 管理这个进程,主要是一直监控进程的状态,是否需要开始,和啥时候结束