zoukankan      html  css  js  c++  java
  • 视频批量转换为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

  • 相关阅读:
    1063. Set Similarity
    A1047. Student List for Course
    A1039. Course List for Student
    最大公约数、素数、分数运算、超长整数计算总结
    A1024. Palindromic Number
    A1023. Have Fun with Numbers
    A1059. Prime Factors
    A1096. Consecutive Factors
    A1078. Hashing
    A1015. Reversible Primes
  • 原文地址:https://www.cnblogs.com/wuhenke/p/1598957.html
Copyright © 2011-2022 走看看