C# FFmpeg视频处理方法

网上找了很多文章,结合自己的需要,写个FFmpeg的方法:

我用的是FFmpeg4.3.1:C#代码如下:

 /// <summary>
        /// 视频转码
        /// </summary>
        /// <param name="originalVideoFile">源视频文件</param>
        /// <param name="objectVideoFile">目标视频文件</param>
        /// <param name="addWatermark">是否水印</param>
        /// <param name="isVideoCopy">是否仅转码复制</param>
        /// <returns></returns>
        public bool ConvertVideo(string originalVideoFile, string objectVideoFile, bool addWatermark = false, bool isVideoCopy = false)
        {
            bool isok = false;
            //overlay=10:10 : 水印距离视频的左上角坐标
            //右上角:overlay=main_w-overlay_w-10:10
            //左下角:overlay=10:main_h-overlay_h-10
            //右下角:overlay=main_w-overlay_w-10:main_h-overlay_h-10
            //居中 overlay=x=(main_w-overlay_w)/2:y=(main_h-overlay_h)/2
            string watermark = "";
            if (addWatermark)
                watermark = " -i " + Environment.CurrentDirectory + @"\Basic\watermark.png" + " -filter_complex \"overlay=main_w-overlay_w-10:5\" ";//水印 右上角 
            string vcodec = "";
            if (isVideoCopy)
                vcodec = " -vcodec copy "; //-vcodec copy:仅转码 执行速度快,文件大小不会变多少

            //视频和分辨率对应关系 参考https://www.cnblogs.com/cai1432452416/p/11828008.html
            Process p = new Process();//建立外部调用线程
            p.StartInfo.FileName = Environment.CurrentDirectory + @"\Basic\ffmpeg.exe";//使用lgpl版本,涉及商业问题:lgpl版本允许使用,可以不开源项目。
            //视频分辨率720X480 码率1800K(越高越清楚,文件也越大) 帧速率 25/S
            p.StartInfo.Arguments = "-y -i " + originalVideoFile + watermark + " -s 720X480 -b:v 1800k -r 30 " + vcodec + " -f mp4 " + objectVideoFile; //参数(这里就是FFMPEG的参数了) 
            p.StartInfo.UseShellExecute = false;//不使用操作系统外壳程序启动线程(一定为FALSE,详细的请看MSDN)
            p.StartInfo.RedirectStandardError = true;//把外部程序错误输出写到StandardError流中(这个一定要注意,FFMPEG的所有输出信息,都为错误输出流,用StandardOutput是捕获不到任何消息的
            p.StartInfo.CreateNoWindow = false;//不创建进程窗口
            try
            {
                p.ErrorDataReceived += new DataReceivedEventHandler(Output);//外部程序(这里是FFMPEG)输出流时候产生的事件,这里是把流的处理过程转移到下面的方法中,详细请查阅MSDN
                p.Start();//启动线程
                p.BeginErrorReadLine();//开始异步读取
                p.WaitForExit();//阻塞等待进程结束
            }
            catch (Exception exp)
            {
                Console.WriteLine(exp.Message);
                return isok;
            }
            finally
            {
                if (p.HasExited && p.ExitCode == 1)
                    isok = false;
                else
                    isok = true;
                p.Close();//关闭进程
                p.Dispose();//释放资源
            }
            return isok;
        }

        private static void Output(object sendProcess, DataReceivedEventArgs output)
        {
            Process p = sendProcess as Process;
            if (p.HasExited && p.ExitCode == 1) // 在ffmpeg发生错误的时候才输出信息
            {
                //Console.WriteLine(output.Data);
                // throw new Exception("视频处理失败");
            }
        }

项目下Basic文件夹下2个文件:

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值