1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 如何使用ffmpeg进行音频文件合并

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

时间:2022-06-14 07:22:15

相关推荐

如何使用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) => pareTo(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) => pareTo(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{}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。