ffmpeg在asp.net 视频转换

时间:2022-04-20 17:05:29

ffmpeg是一个源于Linux的工具软件,是FLV视频转换器,可以轻易地实现FLV向其它格式avi、asf、 mpeg的转换或者将其它格式转换为flv。在视频播客中,我们通常使用它把我们上传的视频转换为FLV格式,以尽可能大地压缩视频,实现在现有网络带宽上流畅播放视频剪辑。(车延禄)
ffmpeg是DOS控制台程序,它有自己的执行语法,只要我们把它的语法功能掌握好,就可以在命令提示符下使用它来把相应的视频转换为flv格式的文件了。
一、ffmpeg的语法
如:ffmpeg -i aaa.avi -y -s 400*300 -f image2 -ss 0 aaa.jpg -ab 56 -ar 22050 -qmin 3 -qmax 8 -r 15 -qscale 7 aaa.flv
执行过程:

ffmpeg在asp.net 视频转换

《图1》
执行结果:

ffmpeg在asp.net 视频转换

《图2》
参数好多,还有未列出来的参数。下面我们把一些常用的参数介绍一下。
    -y 是否覆盖输出文件。即如果aaa.flv文件已经存在的话,不经提示就覆盖掉了
    -i "aaa.avi"    输入文件。可以自己加路径
    -s 400*300 要生成的视频文件的分辨率大小
    -f image2   要输出的格式是图片格式
(车延禄)
    -ss 0 aaa.jpg 要截取图片的位置,在第0秒截取图片,并保存为aaa.jpg文件
    -aspect 视频纵横比4:3或16:9
    -vcodec xvid    使用XVID编码压缩视频
    -acodec aac 音频编码用AAC
    -ab 56 设定声音比特率,-ac设为立体声时要以一半比特率来设置
    -ac 2   设定声道数,1就是单声道,2就是立体声
    -ar 22050   设定声音采样率
    -qmin 3 设定最小质量,与-qmax(设定最大质量)共用,
    -qmax 8 设定最大质量,与-qmin(设定最小质量)共用,
    -r 15   桢速率(可以改,确认非标准桢率会导致音画不同步,所以只能设定为15或者29.97)
    -qscale 7   以7质量为基础的VBR,取值0.01-255,越小视频质量越好
    aaa.flv 目标文件的文件名
    -vol 200    音频音量大小
通过ffmpeg这个命令我们就可以把avi、asf、mpeg等格式的文件转换为flv视频文件,并生成视频截图。

二、在C#中调用ffmpeg命令
1.执行转换命令:
    ffmpeg是外部命令,在C#中我们需要使用Process来调用外部命令
    //实例化Process,用一个独立线程来执行ffmpeg.exe程序
   
 Process p = new Process();
    //指定Process要执行的外部命令,这里需要指定ffmpeg.exe所在位置的全路径
    p.StartInfo.FileName = "ffmpeg.exe";
    //ffmpeg.exe执行的时候需要的参数
    p.StartInfo.Arguments = " -i aaa.avi -y -s 400*300 -f image2 -ss 0 aaa.jpg -ab 56 -ar 22050 -qmin 3 -qmax 8 -r 15 -qscale 7 aaa.flv";
    //执行ffmpeg.exe文件的时候不显示黑色的dos窗口
    p.StartInfo.CreateNoWindow = true;
    //执行线程
    p.Start();
    当线程启动的时候就会执行ffmpeg进行视频转换了

2.如何取得ffmpeg的转换进度?
    要取得ffmpeg的转换进度不是一件容易的事情,因为ffmpeg没有提供直接取得转换进度的方法,我们只好开动脑瓜来实现它。能过上面第一张图,我们我们可以看到在转换过程中会产生一系列的数据,如果我们能够取到其中的数据,我们就可以解析出转换进度了。

ffmpeg在asp.net 视频转换

《图3》
    如何取得ffmpeg的转换进度呢?Process提供了两个事件ErrorDataReceivedOutputDataReceived来处理线程执行过程中的输出数据
    ......
    //启用错误输出
    p.StartInfo.RedirectStandardError = true;
    //启用标准输出
    //p.StartInfo.RedirectStandardOutput = true;
    //指定错误输出的处理程序
    p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
    //指定标准输出的处理程序
    //p.OutputDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
    ......
    p.Start();
    //读取错误输出信息
    p.BeginErrorReadLine();
    注意:在ffmpeg的执行过程输出数据全部以错误输出产生的(不知道这是什么原因),所以大家不要从标准输出中去取数据,那是取不出来的
    void p_ErrorDataReceived(object sender, DataReceivedEventArgs e)
    {

        if (!String.IsNullOrEmpty(e.Data))
        {
            //通过e.Data.ToString()来截取字符串获得有效信息
        }
    }

3.如何在转换完成后删除原来的视频文件
在转换完flv视频后,我们应当把原来视频文件删除,这又是一个问题。我们要确保视频已转换完毕后再删除原来的视频文件,否则由于原视频文件正在使用,会产生删除异常。视频转换的过程是以一个独立线程运行的,我们应当确保在视频转换线程结束后再执行删除,所以删除功能不应在视频转换线程中实现,而应在主线程中实现。(车延禄)
主线程是如何知道视频转换线程执行完成了呢?
我们可以使用Process对象的Exited事件来实现这个功能。Process对象的Exited事件是在线程执行结束并释放资源后才触发的。要想使这个事件生效需要设置Process对象的p.EnableRaisingEvents = true;,如果p.EnableRaisingEvents = false;则不会触发Exited事件。
    p.EnableRaisingEvents = true;
    p.Exited += new EventHandler(p_Exited);

    void p_Exited(object sender, EventArgs e)
    {
        File.Delete(Server.MapPath("Video/bbb.avi"));
    }

三、在ASP.NET使用ffmpeg进行视频转换的参考代码
配置文件:
    <appSettings>
        <add key="ffname" value="ffmpeg"/>
        <add key="cvt" value=" -i aaa.avi -y -s 400*300 -f image2 -ss 0 aaa.jpg -ab 56 -ar 22050 -qmin 3 -qmax 8 -r 15 -qscale 7 aaa.flv"/>
    </appSettings>

转换代码:(车延禄)
   //读取配置文件中的ffmpeg命令和执行参数
    string exe = ConfigurationManager.AppSettings["ffname"].ToString();
    string str = ConfigurationManager.AppSettings["cvt"].ToString();

string filename = Session["name"].ToString();
    //取出主文件名(不含扩展名)
    filename = filename.Substring(filename.LastIndexOf("\\") + 1, filename.LastIndexOf(".")-filename.LastIndexOf("\\")-1);
    //把原来的aaa.avi,aaa.jpg,aaa.flv等文件的主文件名换为当前主文件名
    str = str.Replace("aaa.avi", Server.MapPath("Video/")+filename+".avi");
    str = str.Replace("aaa.jpg", Server.MapPath("Over/Image/") + filename + ".jpg");
    str = str.Replace("aaa.flv", Server.MapPath("Over/Video/") + filename + ".flv");
    try
    {
        Process p = new Process();
        p.StartInfo.FileName = Server.MapPath("Libs\\") + exe;//指定ffmpeg命令
        p.StartInfo.Arguments = str;    //指定ffmpeg参数
        p.StartInfo.UseShellExecute = false;    //输出信息重定向
        p.StartInfo.CreateNoWindow = true; //不产生dos对话框
        p.StartInfo.RedirectStandardError = true;   //重定向错误输出
        p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);   //指定错误输入处理函数
        p.EnableRaisingEvents = true;   //启用线程结束事件执行权
        p.Exited += new EventHandler(p_Exited); //指定线程结束事件处理函数
        p.Start();
        p.BeginErrorReadLine(); //产生数据时时,读取数据
    }
    catch (Exception ex)
    {
        Response.Write(ex.Message);
    }
    //当页面显示"OVER"时,只说明当前主线程执行到此处,但Process p线程正在处理视频,还没有结束。
    Response.Write("OVER");

//当Process p被释放时触发该方法
    void p_Exited(object sender, EventArgs e)
    {
        File.Delete(Server.MapPath("Video/bbb.avi"));
    }

//ffmpeg每产生一行输出数据就会触发一次该方法
    void p_ErrorDataReceived(object sender, DataReceivedEventArgs e)
    {

if (!String.IsNullOrEmpty(e.Data))
        {
            //......更新数据库中字段,标识该视频为已转换完毕
        }

}

ffmpeg在asp.net 视频转换的更多相关文章

  1. ASP&period;NET下调用ffmpeg与mencoder实现视频转换截屏

    最近要做一个视频播放的系统,用到了ffmpeg和mencoder两个工具,查了一些资料,发现这方面的资料还挺多的,但是就是乱了一点,我自己从头整理了一下,和大家分享一下: 1.ffmpeg实现视频(a ...

  2. c&num; ffmpeg视频转换

    c#  ffmpeg视频转换 什么是ffmpeg,它有什么作用呢,怎么可以使用它呢,带着问题去找答案吧!先参考百度百科把,我觉得它很强大无奇不有,为了方便大家我就把链接提供了! http://baik ...

  3. C&num; 利用ffmpeg 对视频转换系类操作 &lpar;1&rpar; 基本分析

    最近公司做一个项目,开发一个视频站点.项目需求中有很多视频转换的需求,如:格式转换(flv,Mp4),视频水印,视频截图,视频合成,获取视频的基本信息(时间戳,视频大小等).经过网络的收集资料以及自己 ...

  4. java 实现视频转换通用工具类:视频截图-Ffmpeg(四)

    java 实现视频转换通用工具类:获取视频元数据信息(一) java 实现视频转换通用工具类:视频相互转换-总方法及Mencoder(二) java 实现视频转换通用工具类:视频相互转换-Ffmpeg ...

  5. java 实现视频转换通用工具类:视频相互转换-Ffmpeg(三)

    java 实现视频转换通用工具类:获取视频元数据信息(一) java 实现视频转换通用工具类:视频相互转换-总方法及Mencoder(二) 这节主要是ffmpeg的相关方法封装,在实际调用中主要使用f ...

  6. 使用ffmpeg 对视频截图,和视频转换格式

    //执行CMD命令方法 public static void CmdProcess(string command)//调用CMD        {            //实例化一个进程类      ...

  7. c&num; ffmpeg视频转换【转载】

    c#  ffmpeg视频转换 什么是ffmpeg,它有什么作用呢,怎么可以使用它呢,带着问题去找答案吧!先参考百度百科把,我觉得它很强大无奇不有,为了方便大家我就把链接提供了! http://baik ...

  8. Java&plus;Windows&plus;ffmpeg实现视频转换

    最近由于项目需要,研究了一下如何用Java实现视频转换,“着实”废了点心思,整理整理,写出给自己备忘下. 思路 由于之前没有没法过相关功能的经验,一开始来真不知道从哪里入手.当然,这个解决,googl ...

  9. 视频转换ffmpeg

    使用yum在centos下安装ffmpeg   ffmpeg -i IMG_1893.MOV -ab 56 -ar 22050 -b 500 -r 15 -s 640x480 test.mp4   说 ...

随机推荐

  1. JavaScript使用构造函数获取变量的类型名

    在JavaScript中,如何准确获取变量的类型名是一个经常使用的问题. 但是常常不能获取到变量的精确名称,或者必须使用jQuery 中的方法,这里 我通过 typeof ,jQuery.type 和 ...

  2. lua 基础 2 类型和值

    -- 类型 和 值--[[ 8中类型 滚动类nil.boolean. number.string.userdata.function.thread 和 table.]] print (type(&qu ...

  3. &lpar;ASP&period;NET&rpar;C&num;连接Oracle数据库示例&lpar;中文乱码问题解决&rpar;

    接手了一个遗留的ASP.NET系统,数据库用的是Oracle,以前没搞过.NET和Oracle数据库,数据库搞了半天才解决乱码问题,在此做个笔记备忘. 1.下载安装ODAC 1)请去Oracle官网下 ...

  4. No Hibernate Session bound to thread&comma; and configuration does not allow

    今天晚上挺悲催的,遇到了这个问题花费我很长时间,现在总结如下: 到这这种情况的发生有两种情况: 1,没有配置事物只要在Spring配置文件中添加如下代码: <bean id="txMa ...

  5. Linux学习:netstat命令

    Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态等.对于开发来说,很多时候用于查看端口占用情况. 执行netstat命令,其输出结果可以分成两部分: 1)一是“Active ...

  6. P4语言编程快速开始 实践二

    参考:P4语言编程快速开始 上一篇系列博客:P4语言编程快速开始 实践二 Demo 2 本Demo所做的修改及实现的功能: 为simple_router添加一个计数器(counter),该计数器附加( ...

  7. 201521123056《Java程序设计》 第2周学习总结

    1. 本周学习总结 String类: 不可变字符串型: 粗略介绍了枚举类型: 完全限定类名: 泛型数组列表的应用: 2. 书面作业 Q1.使用Eclipse关联jdk源代码,并查看String对象的源 ...

  8. 为Lua5&period;3编写C模块简单示例

    为Lua5.3编写C模块简单示例 一.编译安装Lua5.3 MSVC 命令行安装脚本: @echo off md bin md lib md include cd src cl /c /nologo ...

  9. C&num;之Using(转)

    1.using指令. using 命名空间名字.例如: using System; 这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常 ...

  10. &lbrack;转&rsqb;调整 VirtualBox 虚拟机的磁盘大小

    本文转自:https://cnzhx.net/blog/resizing-lvm-centos-virtualbox-guest/ 发表于 2013-08-20 作者 H Zeng 更新于 2016- ...