C#调用mmpeg进行各种视频转换的类实例
程序员文章站
2023-12-13 10:08:52
本文实例讲述了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#程序设计有所帮助。