首先,我们部署一下文件夹.在工程的目录下新建几个文件夹如下图:
UpFiles文件夹是要保存你上传的文件,PlayFiles文件夹是用于你转换后保存的文件(用于网上播放)
ImgFile文件夹是保存截取视频文件的图片,然后那两个mencoder和ffmpeg文件夹是视频转换工具.此视频转换也
可叫做mencoder+ffmpeg视频转换.
首先,在配置文件中给这些文件夹进行路径的配置.如下
< appSettings >
<!-- 工具文件夹-->
< add key ="ffmpeg" value ="ffmpeg/ffmpeg.exe" />
< add key ="mencoder" value ="mencoder/mencoder.exe" />
< add key ="mplayer" value ="mencoder/mplayer.exe" />
<!-- 上传文件的路径-->
< add key ="upfile" value ="UpFiles" />
<!-- 上专文件图片路径-->
< add key ="imgfile" value ="ImgFile" />
<!-- 上传文件图片大小-->
< add key ="CatchFlvImgSize" value ="240x180" />
< add key ="widthSize" value ="400" />
< add key ="heightSize" value ="350" />
<!-- 转换后文件路径-->
< add key ="playfile" value ="PlayFiles" />
</ appSettings >
 
在上传.ASPX页面中
InBlock.gif标题:<asp:TextBox ID= "txtTitle" runat= "server" Width= "358px"></asp:TextBox>
InBlock.gif<asp:RequiredFieldValidator ID= "RequiredFieldValidator2" runat= "server" ControlToValidate= "txtTitle"
InBlock.gifErrorMessage= "标题不为空"></asp:RequiredFieldValidator>
InBlock.gif<br />
InBlock.gif<asp:FileUpload ID= "FileUpload1" runat= "server" Width= "339px" />
InBlock.gif<asp:Button ID= "btnUpload" runat= "server" OnClick= "btnUpload_Click" Text= "上传视频" Width= "70px" />
InBlock.gif文件类型<span style= "color:Red;">(.asf|.flv|.avi|.mpg|.3gp|.mov|.wmv|.rm|.rmvb)</span>
InBlock.gif<asp:RegularExpressionValidator ID= "p_w_picpathPathValidator" runat= "server" ErrorMessage= "文件类型不正确"
InBlock.gifValidationGroup= "vgValidation" Display= "Dynamic" ValidationExpression= "^[a-zA-Z]:(\\.+)(.asf|.flv|.avi|.mpg|.3gp|.mov|.wmv|.rm|.rmvb)$"
InBlock.gifControlToValidate= "FileUpload1">
InBlock.gif</asp:RegularExpressionValidator>
InBlock.gif<asp:RequiredFieldValidator ID= "RequiredFieldValidator1" runat= "server" ControlToValidate= "FileUpload1"
InBlock.gifErrorMessage= "文件不为空"></asp:RequiredFieldValidator></div>
InBlock.gif<div style= " height:0px; border-top:solid 1px red; font-size:0px;"></div>
InBlock.gif<div>上传列表.</div>
 
程序工作的原理是:视频先上传上去,然后跟着就是开始转换.
所以.在CS 文件中有
这里为了方便我是用sqlDatasource数据控件做数据的操作.
 
InBlock.gif using System;
InBlock.gif using System.Data;
InBlock.gif using System.Configuration;
InBlock.gif using System.Web;
InBlock.gif using System.Web.Security;
InBlock.gif using System.Web.UI;
InBlock.gif using System.Web.UI.WebControls;
InBlock.gif using System.Web.UI.WebControls.WebParts;
InBlock.gif using System.Web.UI.HtmlControls;
InBlock.gif public partial class _Default : System.Web.UI.Page    
InBlock.gif{
InBlock.gif // 扩展名定义
InBlock.gif string[] strArrFfmpeg = new string[] { "asf", "avi", "mpg", "3gp", "mov" };
InBlock.gif string[] strArrMencoder = new string[] { "wmv", "rm", "rmvb" };
InBlock.gif protected void Page_Load( object sender, EventArgs e)
InBlock.gif{
InBlock.gif}
InBlock.gif //
InBlock.gif protected void btnUpload_Click( object sender, EventArgs e)
InBlock.gif{
InBlock.gif string upFileName = "";
InBlock.gif if ( this.FileUpload1.HasFile)
InBlock.gif{
InBlock.gif string fileName = PublicMethod.GetFileName( this.FileUpload1.FileName); // GetFileName();
InBlock.gif if (( string)Session[ "file"] == fileName)
InBlock.gif{
InBlock.gif return;
InBlock.gif}
InBlock.gifupFileName = Server.MapPath(PublicMethod.upFile + fileName);
InBlock.gif this.FileUpload1.SaveAs(upFileName);
InBlock.gif string saveName = DateTime.Now.ToString( "yyyyMMddHHmmssffff") ;
InBlock.gif string playFile = Server.MapPath(PublicMethod.playFile + saveName);
InBlock.gif string imgFile = Server.MapPath(PublicMethod.imgFile + saveName);
InBlock.gif //System.IO.File.Copy(Server.MapPath(PublicMethod.playFile + "00000002.jpg"), Server.MapPath(PublicMethod.imgFile+"aa.jpg"));
InBlock.gifPublicMethod pm = new PublicMethod();
InBlock.gif string m_strExtension = PublicMethod.GetExtension( this.FileUpload1.PostedFile.FileName).ToLower();
InBlock.gif if (m_strExtension == "flv")
InBlock.gif{ //直接拷贝到播放文件夹下
InBlock.gifSystem.IO.File.Copy(upFileName, playFile+ ".flv");
InBlock.gifpm.CatchImg(upFileName, imgFile);
InBlock.gif}
InBlock.gif string Extension = CheckExtension(m_strExtension);
InBlock.gif if (Extension == "ffmpeg")
InBlock.gif{
InBlock.gif  pm.ChangeFilePhy(upFileName, playFile, imgFile);
InBlock.gif}
InBlock.gif else if (Extension == "mencoder")
InBlock.gif{
InBlock.gifpm.MChangeFilePhy(upFileName, playFile, imgFile);
InBlock.gif}
InBlock.gifInsertData( this.txtTitle.Text, fileName,saveName);
InBlock.gifSession[ "file"] = fileName;
InBlock.gif}
InBlock.gif}
InBlock.gif //
InBlock.gif private string CheckExtension( string extension)
InBlock.gif{
InBlock.gif string m_strReturn = "";
InBlock.gif foreach ( string var in this.strArrFfmpeg)
InBlock.gif{
InBlock.gif if (var == extension)
InBlock.gif{
InBlock.gifm_strReturn = "ffmpeg"; break;
InBlock.gif}
InBlock.gif}
InBlock.gif if (m_strReturn == "")
InBlock.gif{
InBlock.gif foreach ( string var in strArrMencoder)
InBlock.gif{
InBlock.gif if (var == extension)
InBlock.gif{
InBlock.gifm_strReturn = "mencoder"; break;
InBlock.gif}
InBlock.gif}
InBlock.gif}
InBlock.gif return m_strReturn;
InBlock.gif}
InBlock.gif插入数据到数据库中 #region 插入数据到数据库中
InBlock.gif private void InsertData( string MediaName, string fileName, string saveName)
InBlock.gif{
InBlock.gif //string name=fileName.Substring(0, fileName.LastIndexOf('.'));
InBlock.gif string imgName = saveName + ".jpg"; //图片文件名;
InBlock.gif string playName = saveName + ".flv";
InBlock.gif string sqlstr = "insert into Media(FMediaName,FMediaUpPath,FMediaPlayPath,FMediaImgPath) values(@MName,@MUppath,@MPlaypath,@MImgpath)";
InBlock.gif //string constr = ConfigurationManager.ConnectionStrings["sqlcon"].ToString();
InBlock.gifSqlDataSource1.InsertCommand = sqlstr;
InBlock.gifSqlDataSource1.InsertCommandType = SqlDataSourceCommandType.Text; // CommandType.Text;
InBlock.gifSqlDataSource1.InsertParameters.Add( "MName",MediaName);
InBlock.gifSqlDataSource1.InsertParameters.Add( "MUppath",PublicMethod.upFile+fileName);
InBlock.gifSqlDataSource1.InsertParameters.Add( "MPlaypath",PublicMethod.playFile+playName);
InBlock.gifSqlDataSource1.InsertParameters.Add( "MImgpath",PublicMethod.imgFile+imgName);
InBlock.gifSqlDataSource1.Insert();
InBlock.gif}
InBlock.gif#endregion
InBlock.gif}
 
PublicMethod类如下:
在这个类里面主要是做文件转换和保存,在转换文件的时候CPU的利用率可以达100%.
它的主要原理是另起一个进程在转换的时候你会发现你的进程里多了一个.
 
InBlock.gif using System;
InBlock.gif using System.Configuration;
/// <summary>
/// Summary description for PublicMethod
/// </summary>
InBlock.gif public class PublicMethod:System.Web.UI.Page
InBlock.gif{
InBlock.gif public PublicMethod()
InBlock.gif{
InBlock.gif}
InBlock.gif //文件路径
InBlock.gif public static string ffmpegtool = ConfigurationManager.AppSettings[ "ffmpeg"];
InBlock.gif public static string mencodertool = ConfigurationManager.AppSettings[ "mencoder"];
InBlock.gif public static string mplayertool = ConfigurationManager.AppSettings[ "mplayer"];
InBlock.gif public static string upFile = ConfigurationManager.AppSettings[ "upfile"] + "/";
InBlock.gif public static string imgFile = ConfigurationManager.AppSettings[ "imgfile"] + "/";
InBlock.gif public static string playFile = ConfigurationManager.AppSettings[ "playfile"] + "/";
InBlock.gif //文件图片大小
InBlock.gif public static string sizeOfImg = ConfigurationManager.AppSettings[ "CatchFlvImgSize"];
InBlock.gif //文件大小
InBlock.gif public static string widthOfFile = ConfigurationManager.AppSettings[ "widthSize"];
InBlock.gif public static string heightOfFile = ConfigurationManager.AppSettings[ "heightSize"];
InBlock.gif // // //获取文件的名字
InBlock.gif public static string GetFileName( string fileName)
InBlock.gif{
InBlock.gif int i = fileName.LastIndexOf("\\") + 1;
InBlock.gif string Name = fileName.Substring(i);
InBlock.gif return Name;
InBlock.gif}
InBlock.gif //获取文件扩展名
InBlock.gif public static string GetExtension( string fileName)
InBlock.gif{
InBlock.gif int i = fileName.LastIndexOf( ".")+1;
InBlock.gif string Name = fileName.Substring(i);
InBlock.gif return Name;
InBlock.gif}
InBlock.gif //
InBlock.gif //运行FFMpeg的视频解码,(这里是绝对路径)#region //运行FFMpeg的视频解码,(这里是绝对路径)
/// <summary>
/// 转换文件并保存在指定文件夹下面(这里是绝对路径)
/// </summary>
/// <param name="fileName">上传视频文件的路径(原文件)</param>
/// <param name="playFile">转换后的文件的路径(网络播放文件)</param>
/// <param name="imgFile">从视频文件中抓取的图片路径</param>
/// <returns>成功:返回图片虚拟地址; 失败:返回空字符串</returns>
InBlock.gif public string ChangeFilePhy( string fileName, string playFile, string imgFile)
InBlock.gif{
InBlock.gif //取得ffmpeg.exe的路径,路径配置在Web.Config中,如:<add key="ffmpeg" value="E:\51aspx\ffmpeg.exe" />    
InBlock.gif string ffmpeg = Server.MapPath(PublicMethod.ffmpegtool);
InBlock.gif if ((!System.IO.File.Exists(ffmpeg)) || (!System.IO.File.Exists(fileName)))
InBlock.gif{
InBlock.gif return "";
InBlock.gif}
InBlock.gif //获得图片和(.flv)文件相对路径/最后存储到数据库的路径,如:/Web/User1/00001.jpg    
InBlock.gif string flv_file = System.IO.Path.ChangeExtension(playFile, ".flv");
InBlock.gif
InBlock.gif //截图的尺寸大小,配置在Web.Config中,如:<add key="CatchFlvImgSize" value="240x180" />    
InBlock.gif string FlvImgSize = PublicMethod.sizeOfImg;
InBlock.gifSystem.Diagnostics.ProcessStartInfo FilestartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
InBlock.gifFilestartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
InBlock.gifFilestartInfo.Arguments = " -i " + fileName + " -ab 56 -ar 22050 -b 500 -r 15 -s " + widthOfFile + "x" + heightOfFile + " " + flv_file;
InBlock.gif //ImgstartInfo.Arguments = " -i " + fileName + " -y -f p_w_picpath2 -t 0.05 -s " + FlvImgSize + " " + flv_img;
InBlock.gif try
InBlock.gif{
InBlock.gif //转换
InBlock.gifSystem.Diagnostics.Process.Start(FilestartInfo);
InBlock.gif //截图
InBlock.gifCatchImg(fileName, imgFile);
InBlock.gif //System.Diagnostics.Process.Start(ImgstartInfo);
InBlock.gif}
InBlock.gif catch
InBlock.gif{
InBlock.gif return "";
InBlock.gif}
InBlock.gif //
InBlock.gif return "";
InBlock.gif}
InBlock.gif //
InBlock.gif public string CatchImg( string fileName, string imgFile)
InBlock.gif{
InBlock.gif //
InBlock.gif string ffmpeg = Server.MapPath(PublicMethod.ffmpegtool);
InBlock.gif //
InBlock.gif string flv_img =imgFile+ ".jpg";
InBlock.gif //
InBlock.gif string FlvImgSize = PublicMethod.sizeOfImg;
InBlock.gif //
InBlock.gifSystem.Diagnostics.ProcessStartInfo ImgstartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
InBlock.gifImgstartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
InBlock.gif //
InBlock.gifImgstartInfo.Arguments = " -i " + fileName + " -y -f p_w_picpath2 -ss 2 -vframes 1 -s " + FlvImgSize + " " + flv_img;
InBlock.gif try
InBlock.gif{
InBlock.gifSystem.Diagnostics.Process.Start(ImgstartInfo);
InBlock.gif}
InBlock.gif catch
InBlock.gif{
InBlock.gif return "";
InBlock.gif}
InBlock.gif //
InBlock.gif if (System.IO.File.Exists(flv_img))
InBlock.gif{
InBlock.gif return flv_img;
InBlock.gif}
InBlock.gif return "";
InBlock.gif}
InBlock.gif#endregion
InBlock.gif //
InBlock.gif //运行FFMpeg的视频解码,(这里是(虚拟)相对路径)#region //运行FFMpeg的视频解码,(这里是(虚拟)相对路径)
/// <summary>
/// 转换文件并保存在指定文件夹下面(这里是相对路径)
/// </summary>
/// <param name="fileName">上传视频文件的路径(原文件)</param>
/// <param name="playFile">转换后的文件的路径(网络播放文件)</param>
/// <param name="imgFile">从视频文件中抓取的图片路径</param>
/// <returns>成功:返回图片虚拟地址; 失败:返回空字符串</returns>
InBlock.gif public string ChangeFileVir( string fileName, string playFile, string imgFile)
InBlock.gif{
InBlock.gif //取得ffmpeg.exe的路径,路径配置在Web.Config中,如:<add key="ffmpeg" value="E:\51aspx\ffmpeg.exe" />    
InBlock.gif string ffmpeg = Server.MapPath(PublicMethod.ffmpegtool);
InBlock.gif if ((!System.IO.File.Exists(ffmpeg)) || (!System.IO.File.Exists(fileName)))
InBlock.gif{
InBlock.gif return "";
InBlock.gif}
InBlock.gif //获得图片和(.flv)文件相对路径/最后存储到数据库的路径,如:/Web/User1/00001.jpg    
InBlock.gif string flv_img = System.IO.Path.ChangeExtension(Server.MapPath(imgFile), ".jpg");
InBlock.gif string flv_file = System.IO.Path.ChangeExtension(Server.MapPath(playFile), ".flv");
InBlock.gif
InBlock.gif //截图的尺寸大小,配置在Web.Config中,如:<add key="CatchFlvImgSize" value="240x180" />    
InBlock.gif string FlvImgSize = PublicMethod.sizeOfImg;
InBlock.gifSystem.Diagnostics.ProcessStartInfo FilestartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
InBlock.gifSystem.Diagnostics.ProcessStartInfo ImgstartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
InBlock.gifFilestartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
InBlock.gifImgstartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
InBlock.gif //此处组合成ffmpeg.exe文件需要的参数即可,此处命令在ffmpeg 0.4.9调试通过    
InBlock.gif //ffmpeg -i F:\01.wmv -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 f:\test.flv
InBlock.gifFilestartInfo.Arguments = " -i " + fileName + " -ab 56 -ar 22050 -b 500 -r 15 -s " + widthOfFile + "x" + heightOfFile + " " + flv_file;
InBlock.gifImgstartInfo.Arguments = " -i " + fileName + " -y -f p_w_picpath2 -t 0.001 -s " + FlvImgSize + " " + flv_img;
InBlock.gif try
InBlock.gif{
InBlock.gifSystem.Diagnostics.Process.Start(FilestartInfo);
InBlock.gifSystem.Diagnostics.Process.Start(ImgstartInfo);
InBlock.gif}
InBlock.gif catch
InBlock.gif{
InBlock.gif return "";
InBlock.gif}
InBlock.gif/**/
///注意:图片截取成功后,数据由内存缓存写到磁盘需要时间较长,大概在3,4秒甚至更长;    
///这儿需要延时后再检测,我服务器延时8秒,即如果超过8秒图片仍不存在,认为截图失败;    
///此处略去延时代码.如有那位知道如何捕捉ffmpeg.exe截图失败消息,请告知,先谢过!    
InBlock.gif if (System.IO.File.Exists(flv_img))
InBlock.gif{
InBlock.gif return flv_img;
InBlock.gif}
InBlock.gif return "";
InBlock.gif}
InBlock.gif#endregion
InBlock.gif //运行mencoder的视频×××转换(这里是(绝对路径))#region //运行mencoder的视频×××转换(这里是(绝对路径))
InBlock.gif public string MChangeFilePhy( string vFileName, string playFile, string imgFile)
InBlock.gif{
InBlock.gif string tool = Server.MapPath(PublicMethod.mencodertool);
InBlock.gif //string mplaytool = Server.MapPath(PublicMethod.ffmpegtool);
InBlock.gif if ((!System.IO.File.Exists(tool)) || (!System.IO.File.Exists(vFileName)))
InBlock.gif{
InBlock.gif return "";
InBlock.gif}
InBlock.gif string flv_file = System.IO.Path.ChangeExtension(playFile, ".flv");
InBlock.gif
InBlock.gif //截图的尺寸大小,配置在Web.Config中,如:<add key="CatchFlvImgSize" value="240x180" />    
InBlock.gif string FlvImgSize = PublicMethod.sizeOfImg;
InBlock.gifSystem.Diagnostics.ProcessStartInfo FilestartInfo = new System.Diagnostics.ProcessStartInfo(tool);
InBlock.gifFilestartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
InBlock.gifFilestartInfo.Arguments = " " + vFileName + " -o " + flv_file + " -of lavf -lavfopts
InBlock.gifi_certify_that_my_video_stream_does_not_use_b_frames -oac mp3lame -lameopts abr:br=56 -ovc lavc    
InBlock.gif-lavcopts vcodec=flv:vbitrate=200:mbd=2:mv0:trell:v4mv:cbp:last_pred=1:dia=-1:cmp=0:vb_strategy=1    
InBlock.gif-vf scale= " + widthOfFile + ": " +heightOfFile + " -ofps 12 -srate 22050";
InBlock.gif try
InBlock.gif{
InBlock.gifSystem.Diagnostics.Process.Start(FilestartInfo);
InBlock.gifCatchImg(flv_file, imgFile);
InBlock.gif}
InBlock.gif catch
InBlock.gif{
InBlock.gif return "";
InBlock.gif}    
InBlock.gif //
InBlock.gif return "";
InBlock.gif}
InBlock.gif#endregion
InBlock.gif}