欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#调用mmpeg进行各种视频转换的类实例

程序员文章站 2023-12-04 17:45:47
本文实例讲述了c#调用mmpeg进行各种视频转换的类。分享给大家供大家参考。具体如下: 这个c#类封装了视频转换所需的各种方法,基本上是围绕着如何通过mmpeg工具来进行...

本文实例讲述了c#调用mmpeg进行各种视频转换的类。分享给大家供大家参考。具体如下:

这个c#类封装了视频转换所需的各种方法,基本上是围绕着如何通过mmpeg工具来进行视频转换

using system.web;
using system.configuration;
namespace dotnet.utilities
{
  //if (this.fload.hasfile)
  //{
  //  string upfilename = httpcontext.current.server.mappath("~/savefile") + "\\" + this.fload.postedfile.filename;
  //  string savename  = datetime.now.tostring("yyyymmddhhmmssffff");
  //  string playfile  = server.mappath(videoconvert.savefile + savename);
  //  string imgfile  = server.mappath(videoconvert.savefile + savename);
  //  videoconvert pm = new videoconvert();
  //  string m_strextension = videoconvert.getextension(this.fload.postedfile.filename).tolower();
  //  if (m_strextension == "flv")
  //  {
  //    system.io.file.copy(upfilename, playfile + ".flv");
  //    pm.catchimg(upfilename, imgfile);
  //  }
  //  string extension = pm.checkextension(m_strextension);
  //  if (extension == "ffmpeg")
  //  {
  //    pm.changefilephy(upfilename, playfile, imgfile);
  //  }
  //  else if (extension == "mencoder")
  //  {
  //    pm.mchangefilephy(upfilename, playfile, imgfile);
  //  }
  //}
  public class videoconvert : system.web.ui.page
  {
    public videoconvert()
    { }
    string[] strarrmencoder = new string[] { "wmv", "rmvb", "rm" };
    string[] strarrffmpeg = new string[] { "asf", "avi", "mpg", "3gp", "mov" };
    #region 配置
    public static string ffmpegtool = configurationmanager.appsettings["ffmpeg"];
    public static string mencodertool = configurationmanager.appsettings["mencoder"];
    public static string savefile = configurationmanager.appsettings["savefile"] + "/";
    public static string sizeofimg = configurationmanager.appsettings["catchflvimgsize"];
    public static string widthoffile = configurationmanager.appsettings["widthsize"];
    public static string heightoffile = configurationmanager.appsettings["heightsize"];
    #endregion
    #region 获取文件的名字
    /// <summary>
    /// 获取文件的名字
    /// </summary>
    public static string getfilename(string filename)
    {
      int i = filename.lastindexof("\\") + 1;
      string name = filename.substring(i);
      return name;
    }
    #endregion
    #region 获取文件扩展名
    /// <summary>
    /// 获取文件扩展名
    /// </summary>
    public static string getextension(string filename)
    {
      int i = filename.lastindexof(".") + 1;
      string name = filename.substring(i);
      return name;
    }
    #endregion
    #region 获取文件类型
    /// <summary>
    /// 获取文件类型
    /// </summary>
    public string checkextension(string extension)
    {
      string m_strreturn = "";
      foreach (string var in this.strarrffmpeg)
      {
        if (var == extension)
        {
          m_strreturn = "ffmpeg"; break;
        }
      }
      if (m_strreturn == "")
      {
        foreach (string var in strarrmencoder)
        {
          if (var == extension)
          {
            m_strreturn = "mencoder"; break;
          }
        }
      }
      return m_strreturn;
    }
    #endregion
    #region 视频格式转为flv
    /// <summary>
    /// 视频格式转为flv
    /// </summary>
    /// <param name="vfilename">原视频文件地址</param>
    /// <param name="exportname">生成后的flv文件地址</param>
    public bool convertflv(string vfilename, string exportname)
    {
      if ((!system.io.file.exists(ffmpegtool)) || (!system.io.file.exists(httpcontext.current.server.mappath(vfilename))))
      {
        return false;
      }
      vfilename = httpcontext.current.server.mappath(vfilename);
      exportname = httpcontext.current.server.mappath(exportname);
      string command = " -i \"" + vfilename + "\" -y -ab 32 -ar 22050 -b 800000 -s 480*360 \"" + exportname + "\""; //flv格式  
      system.diagnostics.process p = new system.diagnostics.process();
      p.startinfo.filename = ffmpegtool;
      p.startinfo.arguments = command;
      p.startinfo.workingdirectory = httpcontext.current.server.mappath("~/tools/");
      p.startinfo.useshellexecute = false;
      p.startinfo.redirectstandardinput = true;
      p.startinfo.redirectstandardoutput = true;
      p.startinfo.redirectstandarderror = true;
      p.startinfo.createnowindow = false;
      p.start();
      p.beginerrorreadline();
      p.waitforexit();
      p.close();
      p.dispose();
      return true;
    }
    #endregion
    #region 生成flv视频的缩略图
    /// <summary>
    /// 生成flv视频的缩略图
    /// </summary>
    /// <param name="vfilename">视频文件地址</param>
    public string catchimg(string vfilename)
    {
      if ((!system.io.file.exists(ffmpegtool)) || (!system.io.file.exists(httpcontext.current.server.mappath(vfilename)))) return "";
      try
      {
        string flv_img_p = vfilename.substring(0, vfilename.length - 4) + ".jpg";
        string command = " -i " + httpcontext.current.server.mappath(vfilename) + " -y -f image2 -t 0.1 -s " + sizeofimg + " " + httpcontext.current.server.mappath(flv_img_p);
        system.diagnostics.process p = new system.diagnostics.process();
        p.startinfo.filename = ffmpegtool;
        p.startinfo.arguments = command;
        p.startinfo.windowstyle = system.diagnostics.processwindowstyle.normal;
        try
        {
          p.start();
        }
        catch
        {
          return "";
        }
        finally
        {
          p.close();
          p.dispose();
        }
        system.threading.thread.sleep(4000);
        //注意:图片截取成功后,数据由内存缓存写到磁盘需要时间较长,大概在3,4秒甚至更长;
        if (system.io.file.exists(httpcontext.current.server.mappath(flv_img_p)))
        {
          return flv_img_p;
        }
        return "";
      }
      catch
      {
        return "";
      }
    }
    #endregion
    #region 运行ffmpeg的视频解码(绝对路径)
    /// <summary>
    /// 转换文件并保存在指定文件夹下
    /// </summary>
    /// <param name="filename">上传视频文件的路径(原文件)</param>
    /// <param name="playfile">转换后的文件的路径(网络播放文件)</param>
    /// <param name="imgfile">从视频文件中抓取的图片路径</param>
    /// <returns>成功:返回图片虚拟地址;失败:返回空字符串</returns>
    public string changefilephy(string filename, string playfile, string imgfile)
    {
      string ffmpeg = server.mappath(videoconvert.ffmpegtool);
      if ((!system.io.file.exists(ffmpeg)) || (!system.io.file.exists(filename)))
      {
        return "";
      }
      string flv_file = system.io.path.changeextension(playfile, ".flv");
      string flvimgsize = videoconvert.sizeofimg;
      system.diagnostics.processstartinfo filestartinfo = new system.diagnostics.processstartinfo(ffmpeg);
      filestartinfo.windowstyle = system.diagnostics.processwindowstyle.hidden;
      filestartinfo.arguments = " -i " + filename + " -ab 56 -ar 22050 -b 500 -r 15 -s " + widthoffile + "x" + heightoffile + " " + flv_file;
      try
      {
        system.diagnostics.process.start(filestartinfo);//转换
        catchimg(filename, imgfile); //截图
      }
      catch
      {
        return "";
      }
      return "";
    }
    public string catchimg(string filename, string imgfile)
    {
      string ffmpeg = server.mappath(videoconvert.ffmpegtool);
      string flv_img = imgfile + ".jpg";
      string flvimgsize = videoconvert.sizeofimg;
      system.diagnostics.processstartinfo imgstartinfo = new system.diagnostics.processstartinfo(ffmpeg);
      imgstartinfo.windowstyle = system.diagnostics.processwindowstyle.hidden;
      imgstartinfo.arguments = "  -i  " + filename + " -y -f image2  -ss 2 -vframes 1 -s  " + flvimgsize + "  " + flv_img;
      try
      {
        system.diagnostics.process.start(imgstartinfo);
      }
      catch
      {
        return "";
      }
      if (system.io.file.exists(flv_img))
      {
        return flv_img;
      }
      return "";
    }
    #endregion
    #region 运行ffmpeg的视频解码(相对路径)
    /// <summary>
    /// 转换文件并保存在指定文件夹下
    /// </summary>
    /// <param name="filename">上传视频文件的路径(原文件)</param>
    /// <param name="playfile">转换后的文件的路径(网络播放文件)</param>
    /// <param name="imgfile">从视频文件中抓取的图片路径</param>
    /// <returns>成功:返回图片虚拟地址;失败:返回空字符串</returns>
    public string changefilevir(string filename, string playfile, string imgfile)
    {
      string ffmpeg = server.mappath(videoconvert.ffmpegtool);
      if ((!system.io.file.exists(ffmpeg)) || (!system.io.file.exists(filename)))
      {
        return "";
      }
      string flv_img = system.io.path.changeextension(server.mappath(imgfile), ".jpg");
      string flv_file = system.io.path.changeextension(server.mappath(playfile), ".flv");
      string flvimgsize = videoconvert.sizeofimg;
      system.diagnostics.processstartinfo imgstartinfo = new system.diagnostics.processstartinfo(ffmpeg);
      imgstartinfo.windowstyle = system.diagnostics.processwindowstyle.hidden;
      imgstartinfo.arguments = "  -i  " + filename + "  -y  -f  image2  -t  0.001  -s  " + flvimgsize + "  " + flv_img;
      system.diagnostics.processstartinfo filestartinfo = new system.diagnostics.processstartinfo(ffmpeg);
      filestartinfo.windowstyle = system.diagnostics.processwindowstyle.hidden;
      filestartinfo.arguments = " -i " + filename + " -ab 56 -ar 22050 -b 500 -r 15 -s " + widthoffile + "x" + heightoffile + " " + flv_file;
      try
      {
        system.diagnostics.process.start(filestartinfo);
        system.diagnostics.process.start(imgstartinfo);
      }
      catch
      {
        return "";
      }
      ///注意:图片截取成功后,数据由内存缓存写到磁盘需要时间较长,大概在3,4秒甚至更长; 
      ///这儿需要延时后再检测,我服务器延时8秒,即如果超过8秒图片仍不存在,认为截图失败;  
      if (system.io.file.exists(flv_img))
      {
        return flv_img;
      }
      return "";
    }
    #endregion
    #region 运行mencoder的视频解码器转换(绝对路径)
    /// <summary>
    /// 运行mencoder的视频解码器转换
    /// </summary>
    public string mchangefilephy(string vfilename, string playfile, string imgfile)
    {
      string tool = server.mappath(videoconvert.mencodertool);
      if ((!system.io.file.exists(tool)) || (!system.io.file.exists(vfilename)))
      {
        return "";
      }
      string flv_file = system.io.path.changeextension(playfile, ".flv");
      string flvimgsize = videoconvert.sizeofimg;
      system.diagnostics.processstartinfo filestartinfo = new system.diagnostics.processstartinfo(tool);
      filestartinfo.windowstyle = system.diagnostics.processwindowstyle.hidden;
      filestartinfo.arguments = " " + vfilename + " -o " + flv_file + " -of lavf -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=200:mbd=2:mv0:trell:v4mv:cbp:last_pred=1:dia=-1:cmp=0:vb_strategy=1 -vf scale=" + widthoffile + ":" + heightoffile + " -ofps 12 -srate 22050";
      try
      {
        system.diagnostics.process.start(filestartinfo);
        catchimg(flv_file, imgfile);
      }
      catch
      {
        return "";
      }
      return "";
    }
    #endregion
  }
}

希望本文所述对大家的c#程序设计有所帮助。