[轉載][修正]IOS中使用SoundTouch庫實現變聲

來源:互聯網
上載者:User

之前寫過一片文章“IOS中使用SoundTouch庫實現變聲”。

最後有很多朋友在部落格上說發出來的代碼在模擬器上運行可以,不能在真機上運行,前段時間一直也很忙,2013好看的美劇熱門排行榜沒時間翻代碼出來查看,望諒解。

今天抽空檢查了一下問題的根源,並且在IPhone 4(ios5.0.1)上測試通過,下面更新一些代碼。

 

同樣是Apple官方的SpeakHere,要下載代碼的,請查看上一篇文章。

  1. void AQRecorder::StartRecord(CFStringRef inRecordFile) 
  2. mSoundTouch.setSampleRate(44100);//mRecordFormat.mSampleRate 
  3.     mSoundTouch.setChannels(1);//mRecordFormat.mChannelsPerFrame 
  4.     mSoundTouch.setTempoChange(1.0); 
  5.     mSoundTouch.setPitchSemiTones(9); 
  6.     mSoundTouch.setRateChange(-0.7); 
  7.  
  8.     mSoundTouch.setSetting(SETTING_SEQUENCE_MS, 40); 
  9.     mSoundTouch.setSetting(SETTING_SEEKWINDOW_MS, 16); 
  10.     mSoundTouch.setSetting(SETTING_OVERLAP_MS, 8); 
  11.      
  12.     //Only use one of the following two options 
  13.     //  mSoundTouch.setSetting(SETTING_USE_QUICKSEEK, 0); 
  14.     //  mSoundTouch.setSetting(SETTING_USE_AA_FILTER, !(0)); 
  15.     //  mSoundTouch.setSetting(SETTING_AA_FILTER_LENGTH, 32); 

 

紅色的兩行很重要,需要指明採樣率和聲道。如果需要使用後面注釋兩個變數,需要在SetupAudioFormat方法執行之後才可以,否則無效,原因大家都懂的。

將麥克風捕捉的聲音回呼函數按照一下代碼更新。

  1. // ____________________________________________________________________________________ 
  2. // AudioQueue callback function, called when an input buffers has been filled. 
  3. void AQRecorder::MyInputBufferHandler(  void *                              inUserData, 
  4.                                         AudioQueueRef                       inAQ, 
  5.                                         AudioQueueBufferRef                 inBuffer, 
  6.                                         const AudioTimeStamp *              inStartTime, 
  7.                                         UInt32                              inNumPackets, 
  8.                                         const AudioStreamPacketDescription* inPacketDesc) 
  9.      
  10.     AQRecorder *aqr = (AQRecorder *)inUserData; 
  11.     try { 
  12.         if (inNumPackets > 0) { 
  13.             UInt32 audioDataByteSize = inBuffer->mAudioDataByteSize; 
  14.             CAStreamBasicDescription queueFormat = aqr->DataFormat(); 
  15.             SoundTouch *soundTouch = aqr->GetSoundTouch(); 
  16.  
  17.             uint nSamples = audioDataByteSize/queueFormat.mBytesPerPacket; 
  18.             soundTouch->putSamples((const SAMPLETYPE *)inBuffer->mAudioData,nSamples); 
  19.              
  20.             SAMPLETYPE *samples = (SAMPLETYPE *)malloc(audioDataByteSize); 
  21.             UInt32 numSamples; 
  22.             do { 
  23.                 memset(samples, 0, audioDataByteSize); 
  24.                 numSamples = soundTouch->receiveSamples((SAMPLETYPE *)samples, nSamples); 
  25.                 // write packets to file 
  26.                 XThrowIfError(AudioFileWritePackets(aqr->mRecordFile, 
  27.                                                     FALSE, 
  28.                                                     numSamples*queueFormat.mBytesPerPacket, 
  29.                                                     NULL, 
  30.                                                     aqr->mRecordPacket, 
  31.                                                     &numSamples, 
  32.                                                     samples), 
  33.                               "AudioFileWritePackets failed"); 
  34.                 aqr->mRecordPacket += numSamples; 
  35.             } while (numSamples!=0); 
  36.             free(samples); 
  37.         } 
  38.          
  39.         // if we're not stopping, re-enqueue the buffe so that it gets filled again 
  40.         if (aqr->IsRunning()) 
  41.             XThrowIfError(AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL), "AudioQueueEnqueueBuffer failed"); 
  42.     } catch (CAXException e) { 
  43.         char buf[256]; 
  44.         fprintf(stderr, "Error: %s (%s)\n", e.mOperation, e.FormatError(buf)); 
  45.     } 

原因大家自己應該能看明白。

之前是在xcode 3.x上寫的代碼,剛開始有朋友反饋時,我以為是版本問題產生的,結果不是神奇影院.

本次更新的代碼是我在xcode4.2和iphone4上測試無誤的,如果還有問題的,可以仔細看看前後兩篇文章。不要吧參數設定錯誤了。

ps:QQ經常不線上,有問題上微博:http://weibo.com/yarin

本文出自 “yarin's blog” 部落格,請務必保留此出處http://yarin.blog.51cto.com/1130898/794768

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.