C#基于FFMPEG进行录制音视频(二)

1 篇文章 0 订阅

我们先创建 合成指令参数的和创建进程任务的类

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

 以上完成了 创建一个辅助合成指令的类 和 一个录制任务的实体类

下一章 是 管理这个进程,主要是一直监控进程的状态,是否需要开始,和啥时候结束

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值