C#调用ffmpeg探索之路记录心得与命令使用方便自己查看

我这个不是写文章,是记录方便自己查阅,和有需要的人查看命令,因为我也是刚研究ffmpeg。

C# ffmpeg 命令大全

C# ffmpeg 命令大全

listcmd.Add(" -i " + 视频流);//-i 输入文件 可以网络地址也可以是本地路径
listcmd.Add("-y");//有重复文件直接覆盖  如果已经存在同名文件 则强制覆盖

listcmd.Add("udp://127.0.0.1:1111");//udp://127.0.0.1:1111 这里是一个本地的推流地址 用来做预览播放使用的
listcmd.Add("-c:v libx264");//后期可以用crf来控制大小
listcmd.Add("-c:v copy");//直接用copy的话体积特别大.
listcmd.Add("-c copy");//-c copy 直接复制音频以及视频流 不做任何转换
listcmd.Add("-f mpegts");//-f mepgts 将视频转换成ts视频流    //segment 表示分段
listcmd.Add("-f segment");//分段保存
listcmd.Add("-v verbose");//未知
listcmd.Add("-timeout 2000000");//未知
listcmd.Add("-loglevel error");//未知
listcmd.Add("-hide_banner");//未知
listcmd.Add("-analyzeduration 2147483647");//未知
listcmd.Add("-probesize 2147483647");//未知
listcmd.Add("-bufsize 5000k");//未知
listcmd.Add("-map 0");//未知
listcmd.Add("-sn");//未知
listcmd.Add("-dn");//未知
listcmd.Add("-bsf:v h264_mp4toannexb");//未知
listcmd.Add("-max_muxing_queue_size 1");//未知

//保存目录永远在最后
listcmd.Add(保存目录);//要跟上后戳.mp4 或者其他格式

ffmpeg批量合并视频命令操作

ffmpeg批量合并视频命令操作
如果合并的视频不用写到文档直接给命令就好了,这样就少了一步操作。

// ffmpeg目录\ffmpeg.exe

//要合并视频的目录是本地的.txt文档一行一个  文档存的数据是按照顺序来合并的从上到下
//下面是文档数据
//file 'C:\\Users\\Administrator\\Desktop\\准备合并视频\\准备合并视频1.mp4'
//file 'C:\\Users\\Administrator\\Desktop\\准备合并视频\\准备合并视频2.mp4'

//保存视频目录以及名称
//E:\短视频菜单\其他杂项\保存合并视频\合并后的.mp4
ffmpeg目录 - y - f concat - safe 0 - i 要合并视频的目录 - c copy 保存视频目录以及名称

ffmpeg直播流下载,并且分段保存,自动保存每个视频文件时间戳格式

List<string> listcmd = new List<string>();
listcmd.Add(" -i " + 直播流地址.flv);
listcmd.Add("-use_wallclock_as_timestamps 1");//如果设置为1,则使用系统时间作为时间戳。<br>默认值为0。
listcmd.Add("-vcodec copy");
listcmd.Add("-acodec copy");
listcmd.Add("-f segment");//分段保存
listcmd.Add("-reset_timestamps 1");//在每个段的开头重置时间戳,这样每个段将以接近零的时间戳开始。<br>默认为0。   可选值1或者0
listcmd.Add("-segment_atclocktime 1");//如果设置为“1”,则按从00:00开始的定时时钟间隔分割。<br>在 segment_time 中指定的时间值用于设置每段的长度   可选值1或者0  
listcmd.Add("-segment_time " + 120);//分段  后面是几秒
listcmd.Add("-strftime 1"); //使用 strftime 函数定义要写入的文件的名称。< br > 如果选择此选项,输出段名称必须包含一个strftime函数模板。< br > 默认值为0。  //函数模板%Y%m%d%H%M
listcmd.Add(保存目录 + "%Y%m%d%H%M.mp4");

C#调用ffmpeg的一种方式

这个是取自FFmpeg.AutoGen
还有研究明白 如果程序主动取消任务 需要如何通知

   public static void Run(string path, string args, string workDir = "")
        {
            string nowDir = Directory.GetCurrentDirectory();  //当前工作路径
            if (workDir != "") Directory.SetCurrentDirectory(workDir);
            Process p = new Process();//建立外部调用线程
            p.StartInfo.FileName = path;//要调用外部程序的绝对路径
            //Environment.SetEnvironmentVariable("FFREPORT", "file=" + ReportFile + ":level=32"); //兼容XP系统
            //p.StartInfo.Environment.Add("FFREPORT", "file=" + ReportFile + ":level=32");
            p.StartInfo.Arguments = args;//参数(这里就是FFMPEG的参数了)
            p.StartInfo.UseShellExecute = false;//不使用操作系统外壳程序启动线程(一定为FALSE,详细的请看MSDN)
            p.StartInfo.RedirectStandardError = true;//把外部程序错误输出写到StandardError流中(这个一定要注意,FFMPEG的所有输出信息,都为错误输出流,用StandardOutput是捕获不到任何消息的...这是我耗费了2个多月得出来的经验...mencoder就是用standardOutput来捕获的)
            p.StartInfo.CreateNoWindow = true;//不创建进程窗口
            p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            p.ErrorDataReceived += new DataReceivedEventHandler(Output);//外部程序(这里是FFMPEG)输出流时候产生的事件,这里是把流的处理过程转移到下面的方法中,详细请查阅MSDN
            p.StartInfo.StandardErrorEncoding = Encoding.UTF8;
            p.Start();//启动线程
            p.BeginErrorReadLine();//开始异步读取
            p.WaitForExit();//阻塞等待进程结束
            p.Close();//关闭进程
            p.Dispose();//释放资源
            Environment.SetEnvironmentVariable("FFREPORT", null); //兼容XP系统
            Directory.SetCurrentDirectory(nowDir);
        }
        /// <summary>
        /// 在ffmpeg发生错误的时候才输出信息
        /// </summary>
        /// <param name="sendProcess"></param>
        /// <param name="output"></param>
        private static void Output(object sendProcess, DataReceivedEventArgs output)
        {
            if (!String.IsNullOrEmpty(output.Data))
            {
                Console.WriteLine(output.Data);
                //LOGGER.PrintLine(output.Data, LOGGER.Warning);
            }

            //Process p = sendProcess as Process;
            //if (p.HasExited && p.ExitCode == 1) // 在ffmpeg发生错误的时候才输出信息
            //{
            //    Console.WriteLine(output.Data);
            //    // throw new Exception("视频处理失败");
            //}
        }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值