ASP.NET 中将视频文件转换成 .flv 格式

2024-04-02 11:18

本文主要是介绍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
    }

这篇关于ASP.NET 中将视频文件转换成 .flv 格式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/869829

相关文章

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

2、PF-Net点云补全

2、PF-Net 点云补全 PF-Net论文链接:PF-Net PF-Net (Point Fractal Network for 3D Point Cloud Completion)是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像

多重背包转换成0-1背包

http://acm.hdu.edu.cn/showproblem.php?pid=2191 多重背包特点: 一种物品有C个(既不是固定的1个,也不是无数个) 优化的方法: 运用神奇的二进制,进行物品拆分,转化成01背包 物品拆分,把13个相同的物品分成4组(1,2,4,6) 用这4组可以组成任意一个1~13之间的数! 原理:一个数总可以用2^

easyui同时验证账户格式和ajax是否存在

accountName: {validator: function (value, param) {if (!/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/i.test(value)) {$.fn.validatebox.defaults.rules.accountName.message = '账户名称不合法(字母开头,允许4-16字节,允许字母数字下划线)';return fal

Prompt - 将图片的表格转换成Markdown

Prompt - 将图片的表格转换成Markdown 0. 引言1. 提示词2. 原始版本 0. 引言 最近尝试将图片中的表格转换成Markdown格式,需要不断条件和优化提示词。记录一下调整好的提示词,以后在继续优化迭代。 1. 提示词 英文版本: You are an AI assistant tasked with extracting the content of

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

一步一步将PlantUML类图导出为自定义格式的XMI文件

一步一步将PlantUML类图导出为自定义格式的XMI文件 说明: 首次发表日期:2024-09-08PlantUML官网: https://plantuml.com/zh/PlantUML命令行文档: https://plantuml.com/zh/command-line#6a26f548831e6a8cPlantUML XMI文档: https://plantuml.com/zh/xmi

单精度浮点数按存储格式转为整数的程序

///#include<cstdio>//-----------------union int_char{unsigned char ch[4];float i;};void out_put(union int_char x)//x86是小端对其模式,即最数据的最低位存储在地址的最低位上。{printf("单精度浮点数值为:%f\n",x.i,x.i);printf("存储位置从左到右