2011-04-19 122 views
2

我正在重新編碼一個文件,或者我有音頻文件我想要改變音高並播放音頻文件。我如何在使用objective-c的iphone程序中設置音高。如何在iphone sdk中設置音頻文件或錄製的音頻文件的音高?

請幫我解決這個問題。

謝謝, Madan Mohan。

+0

你好,瑪丹在你的問題是什麼意思? – CNSivakumar 2011-04-19 11:10:43

+0

@CNSivakumar:抱歉不清楚,音調意味着改變其他角色的曲調。 – 2011-04-19 13:15:22

+0

@MadanMohan先生,我陷入了同樣的問題。你找到了解決方案嗎?你能幫我怎麼過嗎? – hyd00 2016-08-12 10:00:01

回答

0

天真的方法是使用與用於記錄文件的採樣率相比不同的採樣率播放它。例如,如果文件以Fs = 44100Hz記錄,然後以Fs = 22050Hz播放,則會使原始音高減半。

當然,這種天真的方法涉及到改變文件的持續時間,以及其他聲音相關的文物。如果你需要的東西不那麼天真,你將不得不自己實施一個音高轉換算法,這是一個巨大的話題---我建議你從谷歌搜索pitch shift開始。

0

可以使用soundtouch開源項目來改變音調

這裏是鏈接:http://www.surina.net/soundtouch/

一旦你添加soundtouch到你的項目,你必須給輸入聲音文件的路徑,輸出聲音文件路徑和音高變化作爲輸入。

由於需要更多時間來處理聲音,所以最好修改soundtouch,以便在錄製聲音時直接提供數據進行處理。它會使你的應用程序更好。

參考

Real-time Pitch Shifting on the iPhone

Create pitch changing code?

+0

好吧,它是否會改變音調,我的意思是如果我們錄製男聲,那麼我可以播放女聲。 – 2011-04-26 10:05:29

+0

我認爲它不適合您的需求。你必須根據你的需要定製它 – visakh7 2011-04-26 10:06:12

0

你可以改變音高使用AVAudioEngine播放聲音,AVAudioPlayerNode.The樣品測試代碼給出波紋管。

@interface ViewController(){ 

    AVAudioEngine *engine; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self playAudio]; 
} 

-(void)playAudio{ 

    engine = [[AVAudioEngine alloc] init]; 
    NSString* path=[[NSBundle mainBundle] pathForResource:@"test" ofType:@"mp3"]; 
    NSURL *soundUrl = [NSURL fileURLWithPath:path]; 
    AVAudioFile* File = [[AVAudioFile alloc] initForReading: soundUrl error: nil]; 
    AVAudioPlayerNode* node = [AVAudioPlayerNode new]; 

    [node stop]; 
    [engine stop]; 
    [engine reset]; 
    [engine attachNode: node]; 
    AVAudioUnitTimePitch* changeAudioUnitTime = [AVAudioUnitTimePitch new]; 


    //change this rate variable to play fast or slow .   
    changeAudioUnitTime.rate = 1; 

    //change pitch variable to according your requirement. 
    changeAudioUnitTime.pitch = 100; 
    [engine attachNode: changeAudioUnitTime]; 
    [engine connect:node to: changeAudioUnitTime format: nil]; 
    [engine connect:changeAudioUnitTime to: engine.outputNode format:nil]; 
    [node scheduleFile:File atTime: nil completionHandler: nil]; 
    [engine startAndReturnError: nil]; 
    [node play]; 


} 

確保路徑變量具有有效的文件路徑

注::該代碼是實際設備上測試和工作在我project.don't精細忘記添加CoreAudio.framework,AVFoundation.framework。