• 视频批量转换为FLV的软件开发总结(2)——技术总结篇:FFmpeg


      下面专门总结一下技术上的经验和收获,主要是关于自己使用FFmpeg遇到的实际问题和解决方法,同时会推荐相关网上的资料。

      一、ffmpeg支持格式问题

      ffmpeg.exe能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等),对ffmpeg.exe无法解析的文件格式(wmv9,rm,rmvb等),可采用Mencoder来转换。

       二、ffmpeg参数问题

      例子:ffmpeg -y -i "1.avi" -title "Test" -vcodec xvid -s 368x208 -r 29.97 -b 1500 -acodec aac -ac 2 -ar 24000 -ab 128 -vol 200 -f psp -muxvb 768 "1.***"

    解释:以上命令可以在Dos命令行中输入,也可以创建到批处理文件中运行。不过,前提是:要在ffmpeg所在的目录中执行(转换君所在目录下面的cores子目录)。
    参数:
    -y(覆盖输出文件,即如果1.***文件已经存在的话,不经提示就覆盖掉了)
    -i "1.avi"(输入文件是和ffmpeg在同一目录下的1.avi文件,可以自己加路径,改名字)
    -title "Test"(在PSP中显示的影片的标题)
    -vcodec xvid(使用XVID编码压缩视频,不能改的)
    -s 368x208(输出的分辨率为368x208,注意片源一定要是16:9的不然会变形)
    -r 29.97(帧数,一般就用这个吧)
    -b 1500(视频数据流量,用-b xxxx的指令则使用固定码率,数字随便改,1500以上没效果;还可以用动态码率如:-qscale 4和-qscale 6,4的质量比6高)
    -acodec aac(音频编码用AAC)
    -ac 2(声道数1或2)
    -ar 24000(声音的采样频率,好像PSP只能支持24000Hz)
    -ab 128(音频数据流量,一般选择32、64、96、128)
    -vol 200(200%的音量,自己改)
    -f psp(输出psp专用格式)
    -muxvb 768(好像是给PSP机器识别的码率,一般选择384、512和768,我改成1500,PSP就说文件损坏了)
    "1.***"(输出文件名,也可以加路径改文件名)

       转载自:http://g006.javaeye.com/blog/347152

       三、ffmpeg获取输出信息 (问题解决:http://www.ffmpeg.com.cn/index.php/.NET_2.0(C ) 

      转载: .NET 2.0 调用FFMPEG,并异步读取输出信息的代码...

       public void ConvertVideo()
        {
              Process p = new Process();//建立外部调用线程
              p.StartInfo.FileName = @"c:\ffmpeg.exe";//要调用外部程序的绝对路径
              p.StartInfo.Arguments = "-i XXXXXXXXXXXXXX";//参数(这里就是FFMPEG的参数了)
              p.StartInfo.UseShellExecute = false;//不使用操作系统外壳程序启动线程(一定为FALSE,详细的请看MSDN)
              p.StartInfo.RedirectStandardError = true;//把外部程序错误输出写到StandardError流中(这个一定要注意,FFMPEG的所有输出信息,都为错误输出流,
    用StandardOutput是捕获不到任何消息的...这是我耗费了2个多月得出来的经验...mencoder就是用standardOutput来捕获的)          
        p.StartInfo.CreateNoWindow = false;//不创建进程窗口
              p.ErrorDataReceived += new DataReceivedEventHandler(Output);//外部程序(这里是FFMPEG)输出流时候产生的事件,这里是把流的处理过程转移到下面的方法中,详细请查阅MSDN
              p.Start();//启动线程
               p.BeginErrorReadLine();//开始异步读取
               p.WaitForExit();//阻塞等待进程结束
               p.Close();//关闭进程
               p.Dispose();//释放资源
        }
        private void Output(object sendProcess, DataReceivedEventArgs output)
        {
            if (!String.IsNullOrEmpty(output.Data))
            {
                   //处理方法...
             }
        }  
    


      BeginErrorReadLine
       可同步或异步读取 StandardError 流。Read、ReadLine 和 ReadToEnd 等方法对进程的错误输出流执行同步读取操作。
    这些同步读取操作只有在关联的 Process写入其 StandardError 流或关闭该流后才能完成。相反,BeginErrorReadLine 
    在 StandardError 流上开始异步读取操作。此方法会为流输出启用指定的事件处理程序并立即返回到调用方,这样当流输出
    被定向到该事件处理程序时,调用方还可以执行其他操作。
       按照这些步骤对 Process 的 StandardError 执行异步读取操作: 
    • 将 UseShellExecute 设置为 false。
    • 将 RedirectStandardError 设置为 true。
    • 向 ErrorDataReceived 事件添加事件处理程序。事件处理程序必须与 System.Diagnostics.DataReceivedEventHandler 委托签名相匹配。
    • 启动 Process。
    • 调用 Process 的 BeginErrorReadLine。此调用将启动 StandardError 上的异步读取操作。
    • 启动异步读取操作时,关联的 Process 每向其 StandardError 流写入一行文本时,都将调用该事件处理程序。
    • 可通过调用 CancelErrorRead取消异步读取操作。可通过调用方或事件处理程序取消读取操作。取消之后,可以再次调用 BeginErrorReadLine 继续进行异步读取操作。
      ErrorDataReceived 
       事件指示关联的进程已写入其重定向 StandardError 流中。该事件仅在对 StandardError 进行异步读取操作期间发生。
    若要启动异步读取操作,必须重定向 Process 的 StandardError 流,向 ErrorDataReceived 事件添加事件处理程序,
    并调用 BeginErrorReadLine。之后,每当该进程向重定向 StandardError 流中写入一行时,ErrorDataReceived 事件
    都会发出信号,直到该进程退出或调用 CancelErrorRead为止。
    

         四、推荐网址

       JAVA实例:http://www.w3china.org/blog/more.asp?name=lhwork&id=22488

         ffmpeg中国:http://www.ffmpeg.com.cn/

         ffmpeg:http://ffmpeg.org/       

         官方文档:http://ffmpeg.org/ffmpeg-doc.html

         参数说明:http://www.cnblogs.com/94cool/archive/2009/08/28/1555830.html

        http://www.chinaz.com/Design/Video/0223CG32009.html

  • 相关阅读:
    数论--莫比乌斯函数
    数论--欧拉函数
    数论--素数
    数论--逆元
    数论--扩展欧几里得exgcd
    【NOIP 校内模拟】T1 优美的序列(二分+st表+卡常)
    【NOIP校内模拟】T2 飞越行星带(kruskal)
    【NOIP 2017】逛公园(最短路+记忆化搜索)
    【SDOI2009】Elaxia的路线(拓扑+最短路+dp)
    【BZOJ2750】【HAOI2012】道路(最短路+拓扑)
  • 原文地址:https://www.cnblogs.com/wuhenke/p/1598957.html
Copyright © 2020-2023  润新知