91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS下如何使用SoundTouch實現變聲并轉為wav格式進行播放

發布時間:2021-10-21 10:16:18 來源:億速云 閱讀:294 作者:小新 欄目:移動開發

這篇文章將為大家詳細講解有關iOS下如何使用SoundTouch實現變聲并轉為wav格式進行播放,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

首先的問題是:我們調用手機的麥克風采集到的錄音數據是pcm格式的,pcm是裸數據,沒有頭部信息,一般播放器不能播放,所以我們一般都要轉為wav格式,這樣普通的播放器就能播放了,而在iOS中直接可以使用AVAudioPlayer來播放,而不需要去調用底層的API了。關于如果將pcm轉為wav,大家可以參考我前面的博文,這里就不再介紹了。

第二個問題是:如何變聲?還好有一個開源軟件叫“soundtouch”,它是用c++寫的,因此很容易集成到iOS中,而廣受好評的湯姆貓就是利用“soundtouch“來變聲的。下面介紹一下如何在iOS中編譯soundtouch:

1.  在 http://www.surina.net/soundtouch/sourcecode.html 這個網站下載soundtouch的源代碼,下載下來是一個壓縮包,解壓開來的目錄結構如下:

iOS下如何使用SoundTouch實現變聲并轉為wav格式進行播放

2.  將里面所有的.h和.cpp文件拷出來,放到soundtouch目錄下:

iOS下如何使用SoundTouch實現變聲并轉為wav格式進行播放

3.   默認是沒有soundtouch_config.h這個頭文件的,因為它跟具體的平臺有關,需要自己手工編譯生成。大家可以根據soundtouch的文檔說明進行編譯,如果不想自己編譯的話,可以使用我編譯好的。

4.   然后將整個soundtouch下的文件全部添加到xcode中,因為是c++文件,所以要把相應的.m文件修改為.mm文件以便支持c++編譯。

5.   默認情況下,soundtouch使用的錄音數據是float類型的,但是我們錄音數據一般都是short類型,因此找到STTypes.h頭文件,將  #define SOUNDTOUCH_FLOAT_SAMPLES   1 這句注釋掉,將這句

#define SOUNDTOUCH_INTEGER_SAMPLES   1 打開,如下:

iOS下如何使用SoundTouch實現變聲并轉為wav格式進行播放

6.  還有soundtouch和iOS都對BOOL進行了typedef

    soundtouch:typedef int BOOL

    iOS: typedef signed char BOOL

    這樣編譯的時候有沖突,將soundtouch中也改成typedef signed char BOOL即可。

7.  變聲的時候只要使用一個頭文件soundtouch.h,將它導入到你的文件中,然后創建soundtouch對象,設置一些參數:

iOS下如何使用SoundTouch實現變聲并轉為wav格式進行播放

這些只是我自己設置的參數,可以根據自己的需求進行調整。

8.  調用 mSoundTouch.putSamples方法將錄音數據傳遞給soundtouch處理,有兩個參數;第一個是錄音數據,short *類型,第二個是錄音數據的長度。如果你的錄音數據是char *類型的話,需要強制轉換,例如:

char *pcmData = (char *)audioData.bytes;

int pcmSize = audioData.length;

int nSamples = pcmSize / 2;

   // 這里強制將char *轉為short *,注意長度是原來的一般,因為一個short相當于2個char

   mSoundTouch.putSamples((short *)pcmData, nSamples);

9.   調用receiveSamples接收soundtouch處理完的數據,這個方法同樣有兩個參數,是存放數據的緩沖區,因此我們事先要創建一個緩沖區來接收數據,這個函數的返回值是實際接收到的大小。這個方法應該在一個循環中調用,當receiveSamples返回為0表示接收完畢,退出循環,否則繼續接收,例如:

   short *samples = newshort[pcmSize];

   int numSamples = 0;      

   do {

               memset(samples, 0, pcmSize);

               numSamples = mSoundTouch.receiveSamples(samples, pcmSize);

               [soundTouchDatas appendBytes:samples length:numSamples*2];

           } while (numSamples > 0);

           delete [] samples;

           [audioData release];

我這個例子中,將接收到的數據存放在NSMutable中,由于NSMutable是按字節來存放的,因此大小要乘2,即numSamples*2。

10.  錄音數據變聲完后,需要在之前加上44個字節的頭部,轉為wav格式,然后保存

// 加上44個字節的wav頭

NSMutableData *wavDatas = [[NSMutableDataalloc] init];

int fileLength = soundTouchDatas.length;

void *header = createWaveHeader(fileLength, 1, 16000, 16);

[wavDatas appendBytes:header length:44];

[wavDatas appendData:soundTouchDatas];

// 保存到Documents目錄中

NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

NSString *filePath = [path stringByAppendingPathComponent:@"soundtouch.wav"];

[wavDatas writeToFile:filePath atomically:YES];

[soundTouchDatas release];

[wavDatas release];

以上就是使用soundtouch變聲的主要步驟了,附件中是完整的工程,可以直接運行。

注意:這個工程只能運行在真機上,同時必須是armv7以后的手機上。

運行說明:

1.  點擊“開始說話”,進行錄音

2.  點擊“說完了”,停止錄音

3.  錄音停止后會自動進行播放,播完后重新回到“開始說話”

關于“iOS下如何使用SoundTouch實現變聲并轉為wav格式進行播放”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

ios
AI

平山县| 乌审旗| 略阳县| 金华市| 隆林| 遵义县| 苍山县| 房产| 凤凰县| 庄河市| 陆丰市| 莱西市| 理塘县| 宿松县| 名山县| 吐鲁番市| 伊金霍洛旗| 宿迁市| 定南县| 汶上县| 济源市| 思南县| 游戏| 南郑县| 玉树县| 大冶市| 广东省| 邵东县| 黄浦区| 顺义区| 景泰县| 洮南市| 观塘区| 驻马店市| 墨江| 汝南县| 大关县| 海淀区| 许昌县| 蛟河市| 朝阳市|