天天看点

c#使用 FFMPEG 视频格式转换

  偶然收到一份需求,需要将wmv的视频文件,转换成MP4格式,以方便公众号、自媒体等推送后,在线点击播放。

实现思路:下载了格式工厂,提供的方法可满足业务需求,可无损将wmv文件进行转换。出于业务化的考虑,进行了一点点尝试。如果MP4文件的码流格式无要求,那么,你可以按我下面的步骤来实现。

外部应用:

c#使用 FFMPEG 视频格式转换

             说明:mplayer.exe 主要提供桌面端应用视频的播放功能;

        mencoder.exe是Mplayer自带的编码工具(Mplayer是Linux下的播放器,开源,支持几乎所有视频格式的播放,有windows和Mac版本)

        ffmpeg.exe  FLV视频转换器,可以轻易地实现FLV向其它格式avi、asf、 mpeg的转换或者将其它格式转换为flv ,我主要也是用它来实现转换。 

不多说,show my code 

1.创建一个ProcessStartInfo,去调用ffmpeg.exe

private static void Dowork(FileInfo fileinfo)
        {            
            logger.InfoFormat("start deal file {0}",fileinfo.Name);
            var ffmpegPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Extention", "ffmpeg.exe");
            var parameters = BuildCommon(fileinfo);
            var oInfo = new ProcessStartInfo(ffmpegPath,parameters);
            oInfo.UseShellExecute = false;
            oInfo.CreateNoWindow = true;
            oInfo.RedirectStandardOutput = true;
            oInfo.RedirectStandardError = true;
            oInfo.RedirectStandardInput = true;

            try
            {
                //调用ffmpeg开始处理命令
                var proc = Process.Start(oInfo);
                proc.StartInfo = oInfo;
                proc.ErrorDataReceived+=new DataReceivedEventHandler(OnReceive);
                
                proc.OutputDataReceived += new DataReceivedEventHandler(OnReceive);

                proc.Start();
                proc.BeginErrorReadLine();
                proc.WaitForExit();
                //转换成string

                //关闭处理程序
                proc.Close();
                proc.Dispose();
            }
            catch (Exception ex)
            {
                logger.Error(ex);
            }
            finally
            {
            }
            logger.InfoFormat("finish deal file {0}", fileinfo.Name);

        }      

2.获取原视频 相关参数,包括宽高、fps、音频码率、音频采样率等等信息

private static VideoFile GetMovieInfo(string file)
        {
            var ffmpegPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Extention", "ffmpeg.exe");
            var  enc=new VideoEncoder.Encoder();
            enc.FFmpegPath = ffmpegPath;
            VideoFile videoFile = new VideoFile(file);
            enc.GetVideoInfo(videoFile);
            return videoFile;
        }      

3.构建转换参数 参数定义源码中有详细解释

private static string BuildCommon(FileInfo file)
        {
            var parameters = "-i  {1} -c:v libx264 -strict -2 {0} {2}";
            var videoinfo=GetMovieInfo(file.FullName);
            var commond = "";
            if (!string.IsNullOrEmpty(_scale))
            {
                commond += string.Format(" -s {0}", _scale);
            }
            else
            {
                commond += string.Format(" -s {0}x{1}", videoinfo.Width,videoinfo.Height);
            }
            if (!string.IsNullOrEmpty(_fps))
            {
                commond += string.Format(" -r {0}", _fps);
            }
            else
            {
                commond += string.Format(" -r {0}", videoinfo.Fps);
            }
            if (!string.IsNullOrEmpty(_datarate))
            {
                commond += string.Format(" -b {0}", _datarate);
            }
            else
            {
                commond += " -qscale 4";
            }
            if (!string.IsNullOrEmpty(_bitrate))
            {
                commond += string.Format(" -ab {0}", _bitrate);
            }
            else
            {
                commond += string.Format(" -ab {0}k", videoinfo.AudioRate);
            }
            if (!string.IsNullOrEmpty(_freq))
            {
                commond += string.Format(" -ar {0}", _freq);
            }
            else
            {
                commond += string.Format(" -ar {0}k", videoinfo.AudioFreq);
            }

            return string.Format(parameters, commond, file.FullName, file.FullName.Replace(".wmv", ".mp4"));
        }      

总结:FFMPEG.EXE非常强大,市场是主流的转码工具,视频合成、剪切工具都是基于它为底层进行的二次开发,可根据自己的实际需要,来进行研究。

源代码

转载于:https://www.cnblogs.com/butterfly-ffff/p/8032870.html

继续阅读