如何使用ffmpeg进行音频文件合并

public class FolderHelper
  {
    /// <summary>
    /// 获取某个目录下的文件夹
    /// </summary>
    /// <param name="aFolder"></param>
    /// <returns></returns>
    public string[] GetFolder(string aFolder) {
      string[] bFolders = Directory.GetDirectories(aFolder);
      if (bFolders.Length > 0)
      {
        //并非最底层文件夹
        Array.Sort(bFolders);  //文件夹排序

        return bFolders;
      }
      else
      {
        //已经是最底层文件夹
        return null;
      }
    }

    /// <summary>
    /// 逐步深入目录,找到最底层目录
    /// 进行音频合并
    /// </summary>
    /// <param name="aFolders"></param>
    /// <param name="aIsApp"></param>
    public void GetLeafFolder(string aFolder,string[] aFolders,bool aIsApp) {
      if (aFolders != null)
      {
        foreach (var item in aFolders)
        {
          string[] bFoldersTmp = GetFolder(item);
          if (bFoldersTmp != null)
          {
            GetLeafFolder(aFolder,bFoldersTmp, aIsApp);
          }
          else
          {
            //末级文件夹,需要进行音频合并处理
            if (aIsApp)
            {
              AppRecord(item);
            }
            else
            {
              WxRecord(item);
            }
          }
        }
      }
      else
      {
        if (aIsApp)
        {
          AppRecord(aFolder);
        }
        else
        {
          WxRecord(aFolder);
        }
      }
    }

    /// <summary>
    /// 微信录音合并处理
    /// </summary>
    /// <param name="aFolder"></param>
    public void WxRecord(string aFolder) {
      try
      {
        //判断是否已经进行过处理,对已经处理过的不再重复处理
        string bResultFile = $@"{aFolder}/record.mp3";
        if (File.Exists(bResultFile)) {
          //对已经处理过的不再重复处理
          return;
        }
        
        string ffmpegPath = AppDomain.CurrentDomain.BaseDirectory + "ffmpeg.exe";
        ProcessStartInfo startInfo = new ProcessStartInfo(ffmpegPath);
        startInfo.UseShellExecute = false;
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;
        startInfo.CreateNoWindow = true;  //不显示dos程序窗口

        StringBuilder bArguments = new StringBuilder("-i \"concat:");  //命令拼接
        //获取要处理的文件
        DirectoryInfo bDicInfo = new DirectoryInfo(aFolder);
        FileInfo[] bFiles = bDicInfo.GetFiles("*.mp3");
        //微信录音按创建时间排序
        Array.Sort(bFiles, (FileInfo x, FileInfo y) => x.CreationTime.CompareTo(y.CreationTime));
        foreach (var item in bFiles) {
          //命令拼接
          bArguments.Append(item.FullName + "|");
        }
        bArguments.Remove(bArguments.Length - 1, 1);
        bArguments.Append("\" -acodec copy " + aFolder + "/record.mp3");

        //准备执行命令,进行音频合并
        using (Process p = new Process()) {
          startInfo.Arguments = bArguments.ToString();
          p.StartInfo = startInfo;
          p.Start();
          while (!p.HasExited)
          {
            Thread.Sleep(100);
          }
        }

        //删除录音片段
        foreach (var item in bFiles)
        {
          File.Delete(item.FullName);
        }
      }
      catch (Exception e) {

      }
      finally
      {

      }
    }

    /// <summary>
    /// App录音合并处理
    /// </summary>
    /// <param name="aFolder"></param>
    public void AppRecord(string aFolder) {
      try
      {
        //判断是否已经进行过处理,对已经处理过的不再重复处理
        string bResultFile = $@"{aFolder}/record.mp3";
        if (File.Exists(bResultFile))
        {
          //对已经处理过的不再重复处理
          return;
        }

        string bTmpPath = @"/Tmp/";  //临时保存目录
        if (!Directory.Exists($@"{aFolder}/Tmp"))
        {
          Directory.CreateDirectory($@"{aFolder}/Tmp");
        }
        string ffmpegPath = AppDomain.CurrentDomain.BaseDirectory + "ffmpeg.exe";
        ProcessStartInfo startInfo = new ProcessStartInfo(ffmpegPath);
        startInfo.UseShellExecute = false;
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;
        startInfo.CreateNoWindow = true;  //不显示dos程序窗口

        //0.获取需要处理的文件
        DirectoryInfo bDicInfo = new DirectoryInfo(aFolder);
        FileInfo[] bFiles = bDicInfo.GetFiles("*.mp3");
        //微信录音按创建时间排序
        Array.Sort(bFiles, (FileInfo x, FileInfo y) => x.Name.CompareTo(y.Name));
        List<string> bFilePaths = new List<string>();
        foreach (var file in bFiles) {
          bFilePaths.Add(file.FullName);
        }
        
        //string bFinalArguments = "-i \"concat: ";
        StringBuilder bFinalArguments = new StringBuilder("-i \"concat:");
        foreach (var file in bFilePaths)
        {
          string[] bFileStr = file.Split('\\');
          string bFileName = bFileStr[bFileStr.Length - 1].Split('.')[0];
          string bFileWavName = $@"{aFolder}{bTmpPath}{bFileName}.wav";
          //1.将无法识别的mp3文件先转成wav文件
          using (Process p = new Process()) {
            startInfo.Arguments = "-i " + file + " " + bFileWavName;
            p.StartInfo = startInfo;
            p.Start();
            while (!p.HasExited)
            {
              Thread.Sleep(100);
            }
          } 
          

          //2.将wav文件转换回mp3文件
          string bFileMp3Name = $@"{aFolder}{bTmpPath}{bFileName}.mp3";
          using (Process p = new Process())
          {
            startInfo.Arguments = "-i " + bFileWavName + " " + bFileMp3Name;
            p.StartInfo = startInfo;
            p.Start();
            while (!p.HasExited)
            {
              Thread.Sleep(100);
            }
          }
          
          bFinalArguments.Append(bFileMp3Name + "|");
        }
        bFinalArguments.Remove(bFinalArguments.Length - 1, 1);
        bFinalArguments.Append("\" -acodec copy " + aFolder + "/record.mp3");

        //3.进行文件合并
        using (Process p = new Process())
        {
          startInfo.Arguments = bFinalArguments.ToString();
          p.StartInfo = startInfo;
          p.Start();
          while (!p.HasExited)
          {
            Thread.Sleep(100);
          }
        }
        
        //4.删除临时文件
        DirectoryInfo di = new DirectoryInfo($@"{aFolder}/Tmp");
        di.Delete(true);

        //5.删除录音片段
        foreach (var file in bFilePaths) {
          File.Delete(file);
        }
      }
      catch (Exception e)
      {

      }
      finally
      {

      }
    }
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
FFmpeg是一套开源计算机程序,可以用来记录、转换数字音频和视频,并能将其转化为流。要使用FFmpeg合并多个音频文件,可以使用FFmpeg的filter功能来实现。其中,amerge是一种用于合并多个音频为一个音频的方法,效果很好。 要使用amerge命令合并音频文件,可以运行以下命令: ``` ffmpeg -i audio1.mp3 -i audio2.mp3 -filter_complex amerge=inputs=2 output.mp3 ``` 这个命令合并名为audio1.mp3和audio2.mp3的两个音频文件,并将合并的结果保存为output.mp3文件。通过设置inputs参数的值来指定要合并音频文件的数量。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [使用ffmpeg 合并aac格式音频文件的方法](https://download.csdn.net/download/weixin_38568548/12927639)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [使用ffmpeg实现合并多个音频为一个音频的方法](https://blog.csdn.net/weixin_33963189/article/details/86420640)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [使用FFmpeg命令合并音视频](https://blog.csdn.net/qq_33349051/article/details/104061448)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FlYFlOWERANDLEAF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值