微信小程序+.NET(十八) ffmpeg音频转码/拼接/混合
??繼續(xù)完善小程序,昨天對crawler接口進行了修改,解決了網(wǎng)頁壓縮導致的html亂碼問題和JSON對象序列化問題,現(xiàn)在對tts接口進行修改,使其處理科大訊飛在線tts接口的1000字節(jié)問題。
??1000字節(jié),也就是500中文,為了避免有些網(wǎng)頁的亂碼等情況,經(jīng)嘗試取text切分長度=345(?340-350之間),然后是調用第一版的tts方法,這里我用的是多線程處理的,最后將生成的多段語音拼接(注意這里不是合并,合并/混合是將兩段音頻并到一條時間軸上,這里的拼接是將兩段時間軸連接)
??先來說一說ffmpeg,我之前使用ffmpeg轉碼微信小程序錄音.mp3為科大訊飛iat接口要求的.wav格式 :
ffmpeg -y -i D:\IISLocalServer\audios\a.mp3 -acodec pcm_s16le -f s16le -ac 1 -ar 16000 D:\IISLocalServer\audios\a.wav
??這次用的他的音視頻拼接功能:
??網(wǎng)上找到的幾個方法我都嘗試過,最后選擇的是下圖第三種,先將文件名寫入.txt然后進行拼接,最后將中間的.wav和.txt刪除,保留最后結果,并返回相對路徑:
??上圖第一種為合并,最后效果是混合的,類似多重唱,感覺可以用來做音樂伴奏之類的。第二種為直接寫文件名,測試時沒得到我想要的結果,建議采用第三種寫入文件的方式,不過這樣會對多個文件進行創(chuàng)建寫入甚至還有刪除操作,會很慢,即使最大化了gap=345依然很慢,后期我會慢慢嘗試改進,包括這里的多線程處理的優(yōu)化也是,對多線程一直接觸很少,Java期間也基本沒用過。
??這里要注意一下,第三條若是在.NET中無法合并,建議用命令行嘗試命令,若是報錯類似于“文件名不合法”,嘗試加入-safe -0
ffmpeg -f concat -safe -0 -i list.txt -c copy res.wav
??附上最新版本代碼:
/// <summary> /// 拼接音頻 /// </summary> /// <param name="list">需要合并的音頻絕對路徑列表</param> /// <param name="fileCatlog">最后的拼接音頻放入的目錄,也是拼接的工作區(qū)</param> /// <returns></returns> #region 合并音頻 public string mergeAudios(ArrayList list,string fileCatlog) {string mergeListName = CreateFileName(".txt");string mergeList = System.IO.Path.Combine(fileCatlog, mergeListName);FileStream fs = new FileStream(mergeList, FileMode.Create);StreamWriter sw = new StreamWriter(fs);foreach (string s in list){sw.Write("file '"+s+ "'\r\n");}sw.Flush();//清空緩沖區(qū)sw.Close();fs.Close();string mergeFileName = CreateFileName(".wav");string mergeFile = System.IO.Path.Combine(fileCatlog, mergeFileName);string strCmd = "-f concat -safe -0 -i " + mergeList + " -c copy " + mergeFile;//調用ffmpeg.exeSystem.Diagnostics.Process p = new System.Diagnostics.Process();p.StartInfo.FileName = "D:\\ffmpeg\\bin\\ffmpeg.exe"; p.StartInfo.Arguments = " " + strCmd;p.StartInfo.UseShellExecute = true;p.StartInfo.RedirectStandardInput = false;//可能接受來自調用程序的輸入信息 p.StartInfo.RedirectStandardOutput = false;//由調用程序獲取輸出信息 p.StartInfo.RedirectStandardError = false;//重定向標準錯誤輸出p.StartInfo.CreateNoWindow = false;//不顯示程序窗口//啟動程序p.Start();//等待程序執(zhí)行完退出進程p.WaitForExit();//刪除中間.txt文件,中間.wav文件deleteFile(mergeList,1);foreach(string file in list){deleteFile(file, 1);}if (System.IO.File.Exists(mergeFile)){//return returnURL;return mergeFile;}return ""; } #endregion總結
以上是生活随笔為你收集整理的微信小程序+.NET(十八) ffmpeg音频转码/拼接/混合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS中lib和dll
- 下一篇: XML语法学习