架构师_程序员

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 28|回复: 0

[控制台程序] C# 使用 ffmpeg 进行音频转码

[复制链接]
跳转到指定楼层
楼主
发表于 4 天前
zu
官方文档:http://ffmpeg.org/ffmpeg.html
下载地址:http://ffmpeg.org/download.html

用 ffmpeg 进行转码很简单,全部都用默认参数的话用下面这句就行:

  1. ffmpeg.exe -i D:\test\1.aac -y D:\test\1.mp3    -- 1.aac是要转码的输入文件,1.mp3是输出文件,-y是覆盖输出文件的意思
复制代码
当然 ffmpeg 支持很多参数,比如使用什么编码器,指定码率等等……这里就不详细说了(关键是我也不懂hhh)

了解了这个强大的工具怎么用之后,就是在 C# 里怎么用它啦~~

也很简单,用 Process 启动一个进程去调用 ffmpeg 就好了。

直接上代码,我写了一个控制台程序,接收两个参数,分别是输入文件和输出文件(都是绝对路径),然后调用 ffmpeg 进行转码,最终完成转码并输出相应操作信息。

  1. using System;
  2. using System.Diagnostics;

  3. namespace AudioTranscoding
  4. {
  5.     class Program
  6.     {
  7.         static void Main(string[] args)
  8.         {
  9.             Process process = new Process();

  10.             try
  11.             {
  12.                 if (args.Length != 2)
  13.                 {
  14.                     Console.WriteLine("参数不合法");
  15.                     return;
  16.                 }

  17.                 string inputFile = args[0];
  18.                 string outputFile = args[1];

  19.                 process.StartInfo.FileName = "ffmpeg.exe";  // 这里也可以指定ffmpeg的绝对路径
  20.                 process.StartInfo.Arguments = " -i " + inputFile + " -y " + outputFile;
  21.                 process.StartInfo.UseShellExecute = false;
  22.                 process.StartInfo.CreateNoWindow = true;
  23.                 process.StartInfo.RedirectStandardOutput = true;
  24.                 process.StartInfo.RedirectStandardInput = true;
  25.                 process.StartInfo.RedirectStandardError = true;
  26.                 process.ErrorDataReceived += new DataReceivedEventHandler(Output);  // 捕捉ffmpeg.exe的错误信息

  27.                 DateTime beginTime = DateTime.Now;

  28.                 process.Start();
  29.                 process.BeginErrorReadLine();   // 开始异步读取

  30.                 Console.WriteLine("\n开始音频转码...\n");

  31.                 process.WaitForExit();    // 等待转码完成

  32.                 if (process.ExitCode == 0)
  33.                 {
  34.                     int exitCode = process.ExitCode;
  35.                     DateTime endTime = DateTime.Now;
  36.                     TimeSpan t = endTime - beginTime;
  37.                     double seconds = t.TotalSeconds;
  38.                     Console.WriteLine("\n转码完成!总共用时:" + seconds + "秒\n");
  39.                 }
  40.                 // ffmpeg.exe 发生错误
  41.                 else
  42.                 {
  43.                     Console.WriteLine("\nffmpeg.exe 程序发生错误,转码失败!");
  44.                 }
  45.             }
  46.             catch (Exception ex)
  47.             {
  48.                 Console.WriteLine("\n错误!!" + ex.ToString());
  49.             }
  50.             finally
  51.             {
  52.                 process.Close();
  53.             }
  54.         }

  55.         private static void Output(object sendProcess, DataReceivedEventArgs output)
  56.         {
  57.             Process p = sendProcess as Process;
  58.             if (p.HasExited && p.ExitCode == 1) // 在ffmpeg发生错误的时候才输出信息
  59.             {
  60.                 Console.WriteLine(output.Data);
  61.             }
  62.         }
  63.     }
  64. }
复制代码
运行结果:

转码成功:









上一篇:码出高效:Java 开发手册
下一篇:「极客时间」深入浅出区块链
帖子永久地址: 

架构师_程序员 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与架构师_程序员享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和架构师_程序员的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、架构师_程序员管理员和版主有权不事先通知发贴者而删除本文

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

Mail To:help@itsvse.com

QQ|Archiver|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2019-11-12 04:35

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表
即时比分新浪