AVAudioRecorder實現刪除錄音前0.5秒

最近在做一個錄音工具,錄音前0.5秒會偶爾出現底噪過大,波形上沉下浮等狀況。雖然我們團隊審核的時候可以把前0.5秒截掉, 但是如果音頻過多會花費很長的時間。 現要求App直接把錄音的前0.5秒截取掉,,這樣就會避免了上述諸多麻煩。


首先介紹一下AVAudioRecorder: ?這是一個錄音的工具類,一般情況下我們會設置聲道, 采樣率,格式(kAudioFormatLinearPCM),然后調用record方法就會自動轉為wav格式的音頻。其實pcm格式轉成wav格式只是在音頻的前面加上一個44位的頭文件,這44位的頭文件會記錄音頻的一些基本信息。話不多說,現在我們來進行截取。

1、直接剪切

這種方法適合 “音頻后面不拼接任何data數據”

當我們查看AVAudioRecorder官方API的時候會發(fā)現 它并沒有提供關于刪除的方法, 不要急,其實我們可以換個思路, 用“替換”來實現刪除的功能,這時我們會用到replaceBytesInRange這個方法,如下圖1

圖1

(44,16044)的意思是44位到16044位的范圍,之所以從44位開始是因為前44位是wav的頭文件,16044代表的是第16044位,錄音的時候我設置的采樣率是16k,用的short類型占兩位,這樣我們錄制1秒就是32k,0.5秒就是16k(可以微調) ?我們把這個范圍的內容的長度變成0,這樣就相當于把這個范圍的內容截取掉了

2、剪切后修改wav頭文件

由于我們音頻后要拼接一個txt文件,txt里記錄音頻的相關信息,所以語音后面要拼接一段data數據,這樣再用上面的方法就會出現如圖2這樣的問題,后邊有個細長的尾巴,我現在解釋一下為什么會出現這個尾巴。當我們在錄音轉成wav格式的時候 ?頭文件里就記錄了這個音頻的信息, 包括語音時長,文件大小等。如果我們剪去一段音頻,那么頭文件里還是會記錄剪切之前的文件大小, 例如: 語音文件是100k ?我們剪去前16k,這樣只剩下84k,但是頭文件里記錄的音頻文件還是100k,這樣就會導致頭文件把拼接的txt文件當做語音文件來處理。txt文件越大波形的尾巴越長,所以我們現在要把頭文件里的100k也變成84k,這樣就會避免這種問題。

圖2

首先我們截取前16044位,這里面包括0.5s(16k)的音頻和前44位頭文件,然后把剩余的音頻拼接自己修改過的頭文件,頭文件格式如圖3

這種文件網上有很多,里面的算法我也沒太搞清楚,如果有懂音頻的大神還望麻煩做個解答

圖3

引用方法如下: ?targetData就是剩余音頻的流文件

? NSData *header = WriteWavFileHeader(targetData.length,targetData.length + 36,16000,1,32000)

這樣頭文件再拼接剪切過的音頻就會重新生成一個新的wav格式文件,這個文件就是剪切前0.5s后的音頻文件

?NSMutableData *wavDatas = [[NSMutableData alloc]init];

[wavDatas appendData:header];

[wavDatas appendData:targetData];


然后寫入路徑文件 ? ?over。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容