天天看點

ASP.NET 中将視訊檔案轉換成 .flv 格式

   首先,我們部署一下檔案夾.在工程的目錄下建立幾個檔案夾如下:

    Upfiles,ffmpeg,Imgfile, mencoder,playfiles

    将視訊檔案轉換成.flv格式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頁面中

    标題:〈asp:TextBox ID=“txtTitle“ runat=“server“ Width=“358px“〉〈/asp:TextBox〉

    〈asp:RequiredFieldValidator ID=“RequiredFieldValidator2“ runat=“server“ ControlToValidate=“txtTitle“

    ErrorMessage=“标題不為空“〉〈/asp:RequiredFieldValidator〉

    〈br /〉

    〈asp:FileUpload ID=“FileUpload1“ runat=“server“ Width=“339px“ /〉

    〈asp:Button ID=“btnUpload“ runat=“server“ OnClick=“btnUpload_Click“ Text=“上傳視訊“ Width=“70px“ /〉

    檔案類型〈span style=“color:Red;“〉(.asf .flv .avi .mpg .3gp .mov .wmv .rm .rmvb)〈/span〉

    〈asp:RegularExpressionValidator ID=“imagePathValidator“ runat=“server“ ErrorMessage=“檔案類型不正确“

    ValidationGroup=“vgValidation“ Display=“Dynamic“ ValidationExpression=“^[a-zA-Z]:(//.+)(.asf .flv .avi .mpg .3gp .mov .wmv .rm .rmvb)$“

    ControlToValidate=“FileUpload1“〉

    〈/asp:RegularExpressionValidator〉

    〈asp:RequiredFieldValidator ID=“RequiredFieldValidator1“ runat=“server“ ControlToValidate=“FileUpload1“

    ErrorMessage=“檔案不為空“〉〈/asp:RequiredFieldValidator〉〈/div〉

    〈div style=“ height:0px; border-top:solid 1px red; font-size:0px;“〉〈/div〉

    〈div〉上傳清單.〈/div〉程式工作的原理是:視訊先上傳上去,然後跟着就是開始轉換.

    是以.在CS 檔案中有

    這裡為了友善我是用sqlDatasource資料控件做資料的操作.

    using System;

    using System.Data;

    using System.Configuration;

    using System.Web;

    using System.Web.Security;

    using System.Web.UI;

    using System.Web.UI.WebControls;

    using System.Web.UI.WebControls.WebParts;

    using System.Web.UI.HtmlControls;

    public partial class _Default : System.Web.UI.Page

    {

    // 擴充名定義

    string[] strArrFfmpeg = new string[] {“asf“,“avi“,“mpg“,“3gp“,“mov“ };

    string[] strArrMencoder = new string[] {“wmv“,“rm“,“rmvb“ };

    protected void Page_Load(object sender, EventArgs e)

    {

    }

    //

    protected void btnUpload_Click(object sender, EventArgs e)

    {

    string upFileName = ““;

    if (this.FileUpload1.HasFile)

    {

    string fileName = PublicMethod.GetFileName(this.FileUpload1.FileName);// GetFileName();

    if ((string)Session[“file“] == fileName)

    {

    return;

    }

    upFileName = Server.MapPath(PublicMethod.upFile + fileName);

    this.FileUpload1.SaveAs(upFileName);

    string saveName = DateTime.Now.ToString(“yyyyMMddHHmmssffff“) ;

    string playFile = Server.MapPath(PublicMethod.playFile + saveName);

    string imgFile = Server.MapPath(PublicMethod.imgFile + saveName);

    //System.IO.File.Copy(Server.MapPath(PublicMethod.playFile + “00000002.jpg“), Server.MapPath(PublicMethod.imgFile+“aa.jpg“));

    PublicMethod pm = new PublicMethod();

    string m_strExtension = PublicMethod.GetExtension(this.FileUpload1.PostedFile.FileName).ToLower();

    if (m_strExtension == “flv“)

    {//直接拷貝到播放檔案夾下

    System.IO.File.Copy(upFileName, playFile+“.flv“);

    pm.CatchImg(upFileName, imgFile);

    }

    string Extension = CheckExtension(m_strExtension);

    if (Extension == “ffmpeg“)

    {

     pm.ChangeFilePhy(upFileName, playFile, imgFile);

    }

    else if (Extension == “mencoder“)

    {

    pm.MChangeFilePhy(upFileName, playFile, imgFile);

    }

    InsertData(this.txtTitle.Text, fileName,saveName);

    Session[“file“] = fileName;

    }

    }

    //

    private 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;

    }

    #region 插入資料到資料庫中

    private void InsertData(string MediaName,string fileName,string saveName)

    {

    //string name=fileName.Substring(0, fileName.LastIndexOf(’.’));

    string imgName = saveName + “.jpg“;//圖檔檔案名;

    string playName = saveName + “.flv“;

    string sqlstr = “insert into Media(FMediaName,FMediaUpPath,FMediaPlayPath,FMediaImgPath) values(@MName,@MUppath,@MPlaypath,@MImgpath)“;

    //string constr = ConfigurationManager.ConnectionStrings[“sqlcon“].ToString();

    SqlDataSource1.InsertCommand = sqlstr;

    SqlDataSource1.InsertCommandType = SqlDataSourceCommandType.Text;// CommandType.Text;

    SqlDataSource1.InsertParameters.Add(“MName“,MediaName);

    SqlDataSource1.InsertParameters.Add(“MUppath“,PublicMethod.upFile+fileName);

    SqlDataSource1.InsertParameters.Add(“MPlaypath“,PublicMethod.playFile+playName);

    SqlDataSource1.InsertParameters.Add(“MImgpath“,PublicMethod.imgFile+imgName);

    SqlDataSource1.Insert();

    }

    #endregion

    }

    PublicMethod類如下:

    在這個類裡面主要是做檔案轉換和儲存,在轉換檔案的時候CPU的使用率可以達100%.

    它的主要原理是另起一個程序在轉換的時候你會發現你的程序裡多了一個.

    using System;

    using System.Configuration;

    /// 〈summary〉

    /// Summary description for PublicMethod

    /// 〈/summary〉

    public class PublicMethod:System.Web.UI.Page

    {

    public PublicMethod()

    {

    }

    //檔案路徑

    public static string ffmpegtool = ConfigurationManager.AppSettings[“ffmpeg“];

    public static string mencodertool = ConfigurationManager.AppSettings[“mencoder“];

    public static string mplayertool = ConfigurationManager.AppSettings[“mplayer“];

    public static string upFile = ConfigurationManager.AppSettings[“upfile“] + “/“;

    public static string imgFile = ConfigurationManager.AppSettings[“imgfile“] + “/“;

    public static string playFile = ConfigurationManager.AppSettings[“playfile“] + “/“;

    //檔案圖檔大小

    public static string sizeOfImg = ConfigurationManager.AppSettings[“CatchFlvImgSize“];

    //檔案大小

    public static string widthOfFile = ConfigurationManager.AppSettings[“widthSize“];

    public static string heightOfFile = ConfigurationManager.AppSettings[“heightSize“];

    // // //擷取檔案的名字

    public static string GetFileName(string fileName)

    {

    int i = fileName.LastIndexOf(“//“) + 1;

    string Name = fileName.Substring(i);

    return Name;

    }

    //擷取檔案擴充名

    public static string GetExtension(string fileName)

    {

    int i = fileName.LastIndexOf(“.“)+1;

    string Name = fileName.Substring(i);

    return Name;

    }

    //

    #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)

    {

    //取得ffmpeg.exe的路徑,路徑配置在Web.Config中,如:〈add key=“ffmpeg“ value=“E:/51aspx/ffmpeg.exe“ /〉

    string ffmpeg = Server.MapPath(PublicMethod.ffmpegtool);

    if ((!System.IO.File.Exists(ffmpeg))    (!System.IO.File.Exists(fileName)))

    {

    return ““;

    }

    //獲得圖檔和(.flv)檔案相對路徑/最後存儲到資料庫的路徑,如:/Web/User1/00001.jpg

    string flv_file = System.IO.Path.ChangeExtension(playFile, “.flv“);

    //截圖的尺寸大小,配置在Web.Config中,如:〈add key=“CatchFlvImgSize“ value=“240x180“ /〉

    string FlvImgSize = PublicMethod.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;

    //ImgstartInfo.Arguments = “ -i “ + fileName + “ -y -f image2 -t 0.05 -s “ + FlvImgSize + “ “ + flv_img;

    try

    {

    //轉換

    System.Diagnostics.Process.Start(FilestartInfo);

    //截圖

    CatchImg(fileName, imgFile);

    //System.Diagnostics.Process.Start(ImgstartInfo);

    }

    catch

    {

    return ““;

    }

    //

    return ““;

    }

    //

    public string CatchImg(string fileName,string imgFile)

    {

    //

    string ffmpeg = Server.MapPath(PublicMethod.ffmpegtool);

    //

    string flv_img =imgFile+“.jpg“;

    //

    string FlvImgSize = PublicMethod.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)

    {

    //取得ffmpeg.exe的路徑,路徑配置在Web.Config中,如:〈add key=“ffmpeg“ value=“E:/51aspx/ffmpeg.exe“ /〉

    string ffmpeg = Server.MapPath(PublicMethod.ffmpegtool);

    if ((!System.IO.File.Exists(ffmpeg))    (!System.IO.File.Exists(fileName)))

    {

    return ““;

    }

    //獲得圖檔和(.flv)檔案相對路徑/最後存儲到資料庫的路徑,如:/Web/User1/00001.jpg

    string flv_img = System.IO.Path.ChangeExtension(Server.MapPath(imgFile), “.jpg“);

    string flv_file = System.IO.Path.ChangeExtension(Server.MapPath(playFile), “.flv“);

    //截圖的尺寸大小,配置在Web.Config中,如:〈add key=“CatchFlvImgSize“ value=“240x180“ /〉

    string FlvImgSize = PublicMethod.sizeOfImg;

    System.Diagnostics.ProcessStartInfo FilestartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);

    System.Diagnostics.ProcessStartInfo ImgstartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);

    FilestartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

    ImgstartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

    //此處組合成ffmpeg.exe檔案需要的參數即可,此處指令在ffmpeg 0.4.9調試通過

    //ffmpeg -i F:/01.wmv -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 f:/test.flv

    FilestartInfo.Arguments = “ -i “ + fileName + “ -ab 56 -ar 22050 -b 500 -r 15 -s “ + widthOfFile + “x“ + heightOfFile + “ “ + flv_file;

    ImgstartInfo.Arguments = “ -i “ + fileName + “ -y -f image2 -t 0.001 -s “ + FlvImgSize + “ “ + flv_img;

    try

    {

    System.Diagnostics.Process.Start(FilestartInfo);

    System.Diagnostics.Process.Start(ImgstartInfo);

    }

    catch

    {

    return ““;

    }

    ///注意:圖檔截取成功後,資料由記憶體緩存寫到磁盤需要時間較長,大概在3,4秒甚至更長;

    ///這兒需要延時後再檢測,我伺服器延時8秒,即如果超過8秒圖檔仍不存在,認為截圖失敗;

    ///此處略去延時代碼.如有那位知道如何捕捉ffmpeg.exe截圖失敗消息,請告知,先謝過!

    if (System.IO.File.Exists(flv_img))

    {

    return flv_img;

    }

    return ““;

    }

    #endregion

    #region //運作mencoder的視訊解碼器轉換(這裡是(絕對路徑))

    public string MChangeFilePhy(string vFileName, string playFile, string imgFile)

    {

    string tool = Server.MapPath(PublicMethod.mencodertool);

    //string mplaytool = Server.MapPath(PublicMethod.ffmpegtool);

    if ((!System.IO.File.Exists(tool))    (!System.IO.File.Exists(vFileName)))

    {

    return ““;

    }

    string flv_file = System.IO.Path.ChangeExtension(playFile, “.flv“);

    //截圖的尺寸大小,配置在Web.Config中,如:〈add key=“CatchFlvImgSize“ value=“240x180“ /〉

    string FlvImgSize = PublicMethod.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

    }

繼續閱讀