在asp.net中做视频转换,将各种视频文件转换成.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
}


转载于:https://www.cnblogs.com/moviestar/archive/2007/12/21/1009388.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android实现支付宝AR功能,Android接入支付宝实现支付功能实例

我本来是想直接讲Android支付这一块的&#xff0c;包括支付宝&#xff0c;微信&#xff0c;其他第三方整合支付等&#xff0c;但是微信开放平台他对我的账号做了限制&#xff0c;所有我今天就先把重心放在支付宝的支付上&#xff0c;也算是写得尽可能详细些吧&#xff0c;毕竟是…

httpd 处理模型

prefork 一个请求用一个进程响应。预先生成一批进程&#xff0c;定时清理一批&#xff0c;同时生成一批。 worker 一个请求用一个线程响应&#xff08;启动多个进程&#xff0c;多个进程生成多个线程&#xff09; event 一个进程&#xff0c;处理多个请求&#xff0c;采用事件通…

工作373-前端 import与export区别

import与export区别 1.当用export default people导出时&#xff0c;就用 import people 导入&#xff08;不带大括号&#xff09; 2.一个文件里&#xff0c;有且只能有一个export default。但可以有多个export。 3.当用export name 时&#xff0c;就用import { name }导入&…

设计功能和界面测试用例

1.1 文本框、按钮等控件测试 1.1.1 文本框的测试 如何对文本框进行测试  a,输入正常的字母或数字。  b,输入已存在的文件的名称&#xff1b;  c,输入超长字符。例如在“名称”框中输入超过允许边界个数的字符&#xff0c;假设最多255个字符&#xff0c;尝试输入 256个字符&a…

android系统的发展态势,2020年安卓手机发展的7个趋势,只有延伸,并无革命性的变化...

在2019年&#xff0c;国内的几家手机厂家都是有得有失&#xff0c;虽然华为在国内大杀四方&#xff0c;但是海外市场遇到了一些麻烦&#xff0c;OPPO和VIVO也开始走性价比路线了&#xff0c;但是国内的市场还是被华为打压的厉害&#xff0c;不过海外发展还可以&#xff0c;至于…

PL/SQL 编程(二)

版权声明&#xff1a;本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/u011685627/article/details/26299399 1 For循环语法&#xff1a;beginfor i in reverse 1..10 loopinsert into users values(i,’奥巴马‘)。end loop&#xff1b;end;注意&#x…

工作375-input readonly

readonly 属性规定输入字段为只读。 只读字段是不能修改的。不过&#xff0c;用户仍然可以使用 tab 键切换到该字段&#xff0c;还可以选中或拷贝其文本。 readonly 属性可以防止用户对值进行修改&#xff0c;直到满足某些条件为止&#xff08;比如选中了一个复选框&#xff…

[导入]使用SqlCommand对象执行存储过程

表tbClass存放论坛分类 字段名 字段类型 允许空 说明 ClassID uniqueidentifier 否 GUID主键&#xff0c;默认值newid() ClassName Varchar(50) 否 分类名 表tbBoard存放论坛分类中的版块 字段名 字段类型 允许空 说明 BoardID uniqueidentifier 否 GUID主键…

鸿蒙系统开发资金,华为终于动手,将拿出超十亿资金,开发者们有福了

原标题&#xff1a;华为终于动手&#xff0c;将拿出超十亿资金&#xff0c;开发者们有福了3月份也是慢慢地要过完了&#xff0c;4月的到来&#xff0c;仿佛是一个讯号&#xff0c;毕竟鸿蒙即将上线&#xff0c;大家都在期待着这款华为国产的系统&#xff0c;究竟能有什么表现&a…

Java-Runoob-高级教程-实例-数组:10. Java 实例 – 查找数组中的重复元素-un

ylbtech-Java-Runoob-高级教程-实例-数组&#xff1a;10. Java 实例 – 查找数组中的重复元素1.返回顶部 1、Java 实例 - 查找数组中的重复元素 Java 实例 以下实例演示了如何在 java 中找到重复的元素&#xff1a; Main.java 文件 public class MainClass {public static void…

[导入]ServerVariables集合

APPL_PHYSICAL_PATH检索与元数据库路径相应的物理路径。AUTH_TYPE这是用户访问受保护的脚本时&#xff0c;服务器用于检验用户的验证方法。CERT_COOKIE客户端验证的唯一ID&#xff0c;以字符串方式返回。CERT_SERIALNUMBER用户验证的序列号字段。CERT_SERVER_ISSUER服务器验证的…

华为android9.0升级,华为官方更新消息:这几款手机9月5日分批推送安卓9.0系统升级...

原标题&#xff1a;华为官方更新消息&#xff1a;这几款手机9月5日分批推送安卓9.0系统升级随着手机技术的不断发展&#xff0c;不仅手机更新换代加快&#xff0c;就连手机系统也在快速更新&#xff0c;可能很多花粉刚刚升级了基于Android8.0的EMUI8.0系统&#xff0c;对于Andr…

[jQuery] jQuery的attr和prop方法有什么区别?

[jQuery] jQuery的attr和prop方法有什么区别&#xff1f; 一、property 固有属性。 打开控制台审查元素 切换Tab至 Properties下 查看固有属性二、自定义属性(固有属性列表中没有的属性&#xff0c;都称为自定义属性。)1: 对于HTML元素本身就带有的固有属性&#xff0c;在处理时…

python中strip、startswith、endswith

python中strip、startswith、endswith strip(rm)用来删除元素内的空白符&#xff1a; rm对应要删除空白符的元素&#xff0c;当rm为空(strip())时删除所有元素的空白符 startswith、endswith用来查找开头或结尾条件的元素 例子&#xff1a; 1 li ["alec", " ar…

[jQuery] jQuery是如何链式调用的?

[jQuery] jQuery是如何链式调用的&#xff1f; 返回对象本身即可&#xff0c;类似 obj { func: function(){ return obj } }&#xff0c; 那么 obj.func().func() 可以无限而链式的调用下去。 而函数内的 obj 往往也可以用 this 来轻松方便地取代。个人简介 我是歌谣&#x…

outlook中的邮件归档

对于outlook中的邮件&#xff0c;可以通过以下方法来做到像lotus notes那样归档&#xff0c;文件->归档系统会创建C:\Documents and Settings\Administrator\Local Settings\Application Data\Microsoft\Outlook\archive.pst文件&#xff0c;并且在“所有文件夹”区域会多出…

WPF Color、String、Brush转换

WPF Color、String、Brush转换 原文:WPF Color、String、Brush转换版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/BYH371256/article/details/79957419 //int 转 System.Windows.Media.Color private System.Windows.Media…

android终端系统时间,安卓应用修改系统时间

前言通常&#xff0c;我们来获取系统时间来做一些事情&#xff0c;那么&#xff0c;如何设置系统时间呢&#xff1f;问题抛出来&#xff0c;解决方法也就应运而生了。解决方法命令行首先我想到的是手机root&#xff0c;然后命令行date -s 要设置的时间复制代码如果手机没 root …

[jQuery] 说说看jQuery的选择器有哪些?

[jQuery] 说说看jQuery的选择器有哪些&#xff1f; 1.基本选择器: #id 、element 、.class 、* 、selector1... 2.层次选择器: ancestor descendant 、parent > child ... 3.基本过滤器选择器 :first 、:last 、:not 、:even 、:odd 、... 4.内容过滤器选择器 :contains 、…