C#使用ffmpeg对画面进行旋转

命令参考自:https://blog.csdn.net/lhtzbj12/article/details/53538857

本地ffmpeg文件下载:https://ffmpeg.zeranoe.com/builds/win64/static/

解压后将ffmpeg.exe拷贝到文件夹下,在cmd命令提示符中定位到所在目录,执行以下语句及即可实现功能

-vf transpose 旋转视频
0:逆时针旋转90°然后垂直翻转
1:顺时针旋转90°
2:逆时针旋转90°
3:顺时针旋转90°然后水平翻转
hflip 水平翻转
vflip 垂直翻转

--视频顺时针旋转90度
ffmpeg -y -i "D:VideoTextvideo.mp4" -vf transpose=1 -acodec copy "D:VideoTextvideoRight90.mp4"

--视频顺时逆旋转90度
ffmpeg -y -i "D:VideoTextvideo.mp4" -vf transpose=2 -acodec copy "D:VideoTextvideoLeft90.mp4"

--顺时针旋转90°然后水平翻转
ffmpeg -y -i "D:VideoTextvideo.mp4" -vf transpose=3 -acodec copy "D:VideoTextvideo1.mp4"

--逆时针旋转90°然后垂直翻转
ffmpeg -y -i "D:VideoTextvideo.mp4" -vf transpose=0 -acodec copy "D:VideoTextvideo2.mp4"

--垂直翻转
ffmpeg -y -i "D:VideoTextvideo.mp4" -vf vflip -acodec copy "D:VideoTextvideovflip.mp4"

--水平翻转
ffmpeg -y -i "D:VideoTextvideo.mp4" -vf hflip -acodec copy "D:VideoTextvideohflip.mp4"

以下为C#代码实现:

//ffmpeg执行文件的路径
        private static string ffmpeg = System.AppDomain.CurrentDomain.BaseDirectory + "ffmpeg\ffmpeg.exe";

#region 视频旋转
        /// <summary>
        /// 视频旋转
        /// </summary>
        /// <param name="videoFilePath">视频绝对路径</param>
        /// <param name="dealVideFilePath">视频旋转后保存路径</param>
        /// <param name="flag">1=顺时针旋转90度  2=逆时针旋转90度</param>
        /// <returns>true  成功  false  失败</returns>
        public static bool VideoRotate(string videoFilePath,string dealVideFilePath,string flag)
        {
            //ffmpeg -i success.mp4 -metadata:s:v rotate="90" -codec copy output_success.mp4
            string output;
            string error;
            //执行命令
            ExecuteCommand(""" + ffmpeg + """ + " -y -i " + """ + videoFilePath + """ + " -vf transpose=" + flag + " -acodec copy " + """ + dealVideFilePath + """, out output, out error);
            if (File.Exists(dealVideFilePath))
                return true;
            else
                return false;
        }
        #endregion


#region 让ffmpeg执行一条命令
        /// <summary>
        /// 让ffmpeg执行一条command命令
        /// </summary>
        /// <param name="command">需要执行的Command</param>
        /// <param name="output">输出</param>
        /// <param name="error">错误</param>
        private static void ExecuteCommand(string command, out string output, out string error)
        {
            try
            {
                //创建一个进程
                Process pc = new Process();
                pc.StartInfo.FileName = command;
                pc.StartInfo.UseShellExecute = false;
                pc.StartInfo.RedirectStandardOutput = true;
                pc.StartInfo.RedirectStandardError = true;
                pc.StartInfo.CreateNoWindow = true;

                //启动进程
                pc.Start();

                //准备读出输出流和错误流
                string outputData = string.Empty;
                string errorData = string.Empty;
                pc.BeginOutputReadLine();
                pc.BeginErrorReadLine();

                pc.OutputDataReceived += (ss, ee) =>
                {
                    outputData += ee.Data;
                };

                pc.ErrorDataReceived += (ss, ee) =>
                {
                    errorData += ee.Data;
                };

                //等待退出
                pc.WaitForExit();

                //关闭进程
                pc.Close();

                //返回流结果
                output = outputData;
                error = errorData;
            }
            catch (Exception ex)
            {
                output = null;
                error = null;
            }
        }
        #endregion
原文地址:https://www.cnblogs.com/yhnet/p/12487619.html