當前位置:首頁 > 資訊 > info6 > 正文

基于neatupload和ffmpeg轉碼技術的在線視頻系統設計與實現(一)

發表于: 2011-04-07   作者:chclvzxx   來源:轉載   瀏覽:
摘要: ?由于項目需要開發一個在線視頻系統,功能需要跟優酷類似,但必須支持大文件的上傳,由于原來系統是基于.net平臺開發,一般10M以下的文件上傳通過設置Web.Config里面的?maxRequestLength屬性即可,再用VS2008自帶的FileUpload控件就可以了,但是如果要上傳100M甚至1G的文件就不能這樣上傳了。Google之,發現大體上有兩種解決方案:?1.利用隱含的HttpWor

  由于項目需要開發一個在線視頻系統,功能需要跟優酷類似,但必須支持大文件的上傳,由于原來系統是基于.net平臺開發, 一般10M以下的文件上傳通過設置Web.Config里面的 maxRequestLength屬性即可,再用VS2008自帶的FileUpload控件就可以了,但是如果要上傳100M甚至1G的文件就不能這樣上傳了。Google之,發現大體上有兩種解決方案:

 1.利用隱含的HttpWorkerRequest,用它的GetPreloadedEntityBody 和 ReadEntityBody方法從IIS為ASP.NET建立的pipe里分塊讀取數據

  IServiceProvider provider = (IServiceProvider) HttpContext.Current;
  HttpWorkerRequest wr = (HttpWorkerRequest) provider.GetService(typeof(HttpWorkerRequest));
  byte[] bs = wr.GetPreloadedEntityBody();
  ....
  if (!wr.IsEntireEntityBodyIsPreloaded())
  {
        int n = 1024;
        byte[] bs2 = new byte[n];
        while (wr.ReadEntityBody(bs2,n) >0)
       {
             .....
        }
  }

感覺該方法實現起來比較麻煩,況且沒有較多的時間進行研究,有興趣的朋友可以參考一下這篇文章:http://blog.joycode.com/saucer/archive/2004/03/16/16225.joy

 2.采用第三方控件實現上傳。這時找到了NeatUpload http://www.brettle.com/neatupload看了一下Demo發現效果很不錯,并且自帶進度條,符合一般人的口味。因此決定選用該方案。下面具體介紹一下如何使用neatupload進行開發。

  •   下載最新版NeatUpload-1.3.22.zip ,解壓后將得到如下文件及文件夾:

             dotnet

             flash

             js

             release

             COPYING-LIB.txt

             LICENSE.txt

             NeatUpload.sln

             ReadMe.txt

             首先我們需要做的是將NeatUpload的兩個主要控件:InputFile和progressbar 添加進VS2008。打開VS2008--->點擊'工具箱'--->選中一項,如:'常規'這項--->單擊右鍵--->在彈出的菜單中選'選擇項'--->在彈出的窗口中選擇'瀏覽'--->找到'Brettle.Web.NeatUpload.dll'這個文件 (在/dotnet/docs/bin文件目錄下)--->按確定就添加上。

  •  新建web項目,將dotnet/app目錄下的NeatUpload文件夾(里面是包括InputFile和progressbar 控件以及相應的CSS控制文件)拷貝到web項目根目錄下。
  • 修改Web.Config文件,添加neatupload功能,修改的地方有5處:

 1  <configuration> 
 2 
 3 <configSections>   
 4 
 5 <sectionGroup name="system.web">   
 6 
 7    <section name="neatUpload"
 8 type="Brettle.Web.NeatUpload.ConfigSectionHandler,Brettle.Web.NeatUpload" allowLocation="true" />   
 9 
10  </sectionGroup> 
11 
12  </configSections>  
13 
14 <system.web> 
15 
16 <httpModules> 
17 
18 <!--上傳大文件--> 
19 
20 <add name="UploadHttpModule"
21 type="Brettle.Web.NeatUpload.UploadHttpModule,Brettle.Web.NeatUpload"/> 
22 
23 </httpModules>  
24 
25  <!--useHttpModule="true" 設為true時才能看到上傳狀態,默認是False-->  
26 
27  <neatUpload useHttpModule="true" maxNormalRequestLength="1048576" maxRequestLength="1048576" defaultProvider="FilesystemUploadStorageProvider"> 
28 
29 <providers>  
30 
31 <add name="FilesystemUploadStorageProvider"
32 type="Brettle.Web.NeatUpload.FilesystemUploadStorageProvider, Brettle.Web.NeatUpload"/> 
33 
34 </providers>  
35 
36 </neatUpload>   
37 
38  <httpRuntime maxRequestLength="1048576" executionTimeout="3600"/> 
39 
40 </system.web>
41 
42 </configuration>

  •   拖放使用上傳控件InputFile和進度條ProgressBar,添加上傳文件的按鈕.aspx頁面代碼如下:

 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="LinkedContent.aspx.cs"
 2     Inherits="Koodoo.Web.LinkedContent" %>
 3 
 4 <%@ Register assembly="Brettle.Web.NeatUpload" namespace="Brettle.Web.NeatUpload" tagprefix="Upload" %>
 5 
 6 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 7 <html xmlns="http://www.w3.org/1999/xhtml">
 8 <head runat="server">
 9     <title></title>
10 </head>
11 <body id="linkedcontent">
12     <form id="form1" runat="server">
13     <div class="pagebox">
14         <div class="innerbox">
15         <Upload:InputFile ID="attachFile" runat="server" />
16         <asp:Button ID="btnUpload" Text="上傳" runat="server" onclick="btnUpload_Click" />
17         <br />
18         <Upload:ProgressBar ID="ProgressBar1" runat="server" />
19        </div>
20     </div>
21     </form>
22 </body>
23 </html>

 

給上傳按鈕添加Upload_Click事件:                                                                                                              protected void Upload_Click(object sender, EventArgs e)
 2     {
 3         if (AttachFile.HasFile)
 4         {
 5             string FileName = this.AttachFile.FileName;//獲取上傳文件的文件名,包括后綴
 6             string ExtenName = System.IO.Path.GetExtension(FileName);//獲取擴展名
 7             string SaveFileName = System.IO.Path.Combine(
 8 System.Web.HttpContext.Current.Request.MapPath("UpLoads/"),
 9  DateTime.Now.ToString("yyyyMMddhhmm"+ ExtenName);//合并兩個路徑為上傳到服務器上的全路徑
10             AttachFile.MoveTo(SaveFileName, Brettle.Web.NeatUpload.MoveToOptions.Overwrite);
11             string url = "UpLoads/" + DateTime.Now.ToString("yyyyMMddhhmmss"+ ExtenName;  //文件保存的路徑
12             float FileSize = (float)System.Math.Round((float)AttachFile.ContentLength / 10240001); //獲取文件大小并保留小數點后一位,單位是M
13          }
14     } 
這樣就完成了一個基本的大文件上傳模塊。

參考文獻如下:

http://www.cnblogs.com/hiearth/archive/2009/07/02/1515467.html

http://www.brettle.com/neatupload

http://www.brettle.com/Demo.aspx

http://blog.joycode.com/saucer/archive/2004/03/16/16225.joy

基于neatupload和ffmpeg轉碼技術的在線視頻系統設計與實現(一)

版權所有 IT知識庫 CopyRight ? 2009-2015 IT知識庫 IT610.com , All Rights Reserved. 京ICP備09083238號
广东25选5开奖结果