献上福利 我自己写的ffmpeg帮助类

       最近在开发mpeg视频编辑工具,深感老外的mpeg做的好强大,跨平台都支持,而且目前多个大型视频软件都在用人家的东西,老外这方面超前太多了,他们做基础,我们做应用,虽然是开源的dll库,哪天说没就没了,不啰嗦了,上代码。主要还是视频截取,截图,转码等初级的应用,砖家别见笑,你还舍不得开源你的代码咧。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;

namespace WinMediaPlayer
{
    class FfmpegHelp
    {

        public static string FFmpegPath = @".\ffmpeg.exe";
       //public static  int currentSecond { get; set; }
       // public static string videoLengh { get;   set; }
        public static string videoUrl { get; internal set; }
        //public static object newVideo { get; internal set; }
        public static double totalSeconds { get; internal set; }

        /// 
        /// 运行mpeg批处理
        /// 
        /// 
        internal  static void RunMyProcess(string Parameters)
        {
          
            //p.StartInfo.RedirectStandardInput = true;   //接受来自调用程序的输入信息
            //p.StartInfo.RedirectStandardOutput = true;  //由调用程序获取输出信息
            //p.StartInfo.RedirectStandardError = true;   //重定向标准错误输出
        
            //向cmd窗口写入命令
            //p.StandardInput.WriteLine(cmd);
            //p.StandardInput.AutoFlush = true;
        

            var p = new Process();
            p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            p.StartInfo.FileName = FFmpegPath;
            p.StartInfo.Arguments = Parameters;
          
            p.StartInfo.UseShellExecute = false;  //是否使用操作系统shell启动

            p.StartInfo.CreateNoWindow = false;  //不显示程序窗口
            p.Start();
            p.WaitForExit();//等待程序执行完退出进程
            p.Close();
        }

        /// 
        /// 截屏
        /// 
        /// 
        /// 
        /// 
        internal static void screenShot(string videoUrlPath, string targetUrl, string currentTime)
        {
            string processPara = string.Format("-ss  {2} -i {0} -t 0.01 -f image2 -y {1}", videoUrlPath, targetUrl, currentTime);
            RunMyProcess(processPara);
            //   ffmpeg - i[视频路径] - r 1 - q:v 2 - f image2 image-% d.jpeg
            //-r:每秒提取的帧数,如上面为每秒1帧,即一张图像
            //- q:v :图片质量
            //- f:图片格式,上述为image2
            //image -% d.jpeg:生成图像的文件名,可以加上完整路径,% d会使文件名按整数编号,如上述生成图像为image - 1.jpeg, image - 2.jpeg, ...
            //还有其他参数:
            //-t:持续时间,如 - t 4表示持续4s
            //- ss:起始时间,如 - ss 01:30:14,从01: 30:14开始
            //- vframes:指定抽取的帧数,如 - vframes 120,指定抽取120张
            //- s:格式大小,如 - s 640x360
            //- y:覆盖,直接使用
        }

        /// 
        /// 手动截取视频
        /// 
        /// 
        /// 
        /// 
        /// 
        internal static void cutVideo(string startTime, int videoLen, string targetVodeo,string videoUrl)
        {
         string    processPara = string.Format("-i   {0}   -ss " + startTime + " -t " + videoLen + " -codec copy  {1} ", videoUrl, targetVodeo);  //视频切割
            RunMyProcess(processPara);
        }

        /// 
        /// 创建文件夹
        /// 
        /// 
        /// 
        internal static string createPath(string targetPath)
        {
            string targetUrl = System.Environment.CurrentDirectory + @"\";
            string targetFolder = targetUrl + DateTime.Now.ToString(targetPath);
            if (!File.Exists(targetFolder))
            {
                Directory.CreateDirectory(targetFolder);
            }
            return targetFolder;
        }

        /// 
        /// 自动切割视频
        /// 
        /// 
        /// 
        /// 
        internal static void autoCutVideo(int videoLengh, int videoCount, string targetFolder)
        {
            string processPara = "";
            int currentSecond = 0;
            for (int i = 0; i < videoCount; i++)
            {
                string newVideo = targetFolder + @"\newFile" + i + @".mp4";
                processPara += string.Format("-i   {0}   -ss " + currentSecond + " -t " + videoLengh + " -codec copy  {1} ", videoUrl, newVideo);  //视频切割
                currentSecond += videoLengh;
                //  RunMyProcess(processPara);
            }
            RunMyProcess(processPara);
        }

        /// 
        /// 视频转码
        /// 
        private void convertCode( string path)
        {
            Process p = new Process();
            p.StartInfo.FileName = path + "ffmpeg.exe";
            p.StartInfo.UseShellExecute = false;
            string srcFileName = "";
            string destFileName = "";
            srcFileName = path + "InitVideo1.mp4";
            destFileName = path + "InitVideo.mp4";
            p.StartInfo.Arguments = "-i " + srcFileName + " -y  -vcodec h264 -b 500000 " + destFileName;    //执行参数
            p.StartInfo.UseShellExecute = false;  ////不使用系统外壳程序启动进程
            p.StartInfo.CreateNoWindow = true;  //不显示dos程序窗口
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;//把外部程序错误输出写到StandardError流中
            //p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
            //p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
            p.StartInfo.UseShellExecute = false;
            p.Start();
            p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            p.BeginErrorReadLine();//开始异步读取
            p.WaitForExit();//阻塞等待进程结束
            p.Close();//关闭进程
            p.Dispose();//释放资源
        }

        //// 去掉视频中的音频
        //ffmpeg -i input.mp4 -vcodec copy -an output.mp4
        //// -an: 去掉音频;-vcodec:视频选项,一般后面加copy表示拷贝

        //// 提取视频中的音频
        //ffmpeg -i input.mp4 -acodec copy -vn output.mp3
        //// -vn: 去掉视频;-acodec: 音频选项, 一般后面加copy表示拷贝

        //// 音视频合成
        //ffmpeg -y –i input.mp4 –i input.mp3 –vcodec copy –acodec copy output.mp4
        //// -y 覆盖输出文件

        ////剪切视频
        //ffmpeg -ss 0:1:30 -t 0:0:20 -i input.mp4 -vcodec copy -acodec copy output.mp4
        //// -ss 开始时间; -t 持续时间

        //// 视频截图
        //ffmpeg –i test.mp4 –f image2 -t 0.001 -s 320x240 image-%3d.jpg
        // -s 设置分辨率; -f 强迫采用格式fmt;

        //// 视频分解为图片
        //ffmpeg –i test.mp4 –r 1 –f image2 image-%3d.jpg
        //// -r 指定截屏频率

        //// 将图片合成视频
        //ffmpeg -f image2 -i image%d.jpg output.mp4

        ////视频拼接
        //ffmpeg -f concat -i filelist.txt -c copy output.mp4

        //// 将视频转为gif
        //ffmpeg -i input.mp4 -ss 0:0:30 -t 10 -s 320x240 -pix_fmt rgb24 output.gif
        //// -pix_fmt 指定编码

        //// 将视频前30帧转为gif
        //ffmpeg -i input.mp4 -vframes 30 -f gif output.gif

        //// 旋转视频
        //ffmpeg -i input.mp4 -vf rotate = PI / 2 output.mp4

        // 缩放视频
        //     ffmpeg -i input.mp4 -vf scale = iw / 2:-1 output.mp4
        // iw 是输入的宽度, iw/2就是一半;-1 为保持宽高比

        //视频变速
        //        ffmpeg -i input.mp4 -filter:v setpts = 0.5 * PTS output.mp4

        //音频变速
        //ffmpeg -i input.mp3 -filter:a atempo = 2.0 output.mp3

        //音视频同时变速,但是音视频为互倒关系
        //ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4


        // 视频添加水印
        //  ffmpeg -i input.mp4 -i logo.jpg -filter_complex[0:v][1:v] overlay = main_w - overlay_w - 10:main_h-overlay_h-10[out] -map[out] -map 0:a -codec:a copy output.mp4
        // main_w-overlay_w-10 视频的宽度-水印的宽度-水印边距;


    }
}

 

你可能感兴趣的:(c#)