如何在iphone sdk中设置音频文件或录制的音频文件的音高?
我正在录制一个文件或我有音频文件,我想更改音高并播放音频文件。如何在使用objective-c的iphone程序中设置音调 请帮我解决这个问题 谢谢,,如何在iphone sdk中设置音频文件或录制的音频文件的音高?,iphone,objective-c,cocoa-touch,audio,pitch,Iphone,Objective C,Cocoa Touch,Audio,Pitch,我正在录制一个文件或我有音频文件,我想更改音高并播放音频文件。如何在使用objective-c的iphone程序中设置音调 请帮我解决这个问题 谢谢,, Madan Mohan。最简单的方法是使用不同的采样率播放,而不是使用记录文件的采样率。例如,如果文件是用Fs=44100Hz录制的,然后用Fs=22050Hz播放,将得到原始音高的一半 当然,这种幼稚的方法包括更改文件的持续时间和其他与声音相关的工件。如果你需要一些不那么幼稚的东西,你必须自己实现一个基音变换算法,这是一个巨大的主题——我建议
Madan Mohan。最简单的方法是使用不同的采样率播放,而不是使用记录文件的采样率。例如,如果文件是用Fs=44100Hz录制的,然后用Fs=22050Hz播放,将得到原始音高的一半
当然,这种幼稚的方法包括更改文件的持续时间和其他与声音相关的工件。如果你需要一些不那么幼稚的东西,你必须自己实现一个基音变换算法,这是一个巨大的主题——我建议你从谷歌搜索
基音变换开始。幼稚的方法是使用不同的采样率来播放它,而不是使用记录文件的采样率。例如,如果文件是用Fs=44100Hz录制的,然后用Fs=22050Hz播放,将得到原始音高的一半
当然,这种幼稚的方法包括更改文件的持续时间和其他与声音相关的工件。如果你需要一些不那么幼稚的东西,你必须自己实现一个音高变换算法,这是一个巨大的主题——我建议你从谷歌搜索音高变换开始。你可以使用soundtouch开源项目来改变音高
以下是链接:
将soundtouch添加到项目中后,必须将输入声音文件路径、输出声音文件路径和音高变化作为输入
由于处理声音需要更多的时间,因此最好修改soundtouch,以便在录制声音时直接提供数据进行处理。这将使你的应用程序更好
参考资料
您可以使用soundtouch开源项目更改音高
以下是链接:
将soundtouch添加到项目中后,必须将输入声音文件路径、输出声音文件路径和音高变化作为输入
由于处理声音需要更多的时间,因此最好修改soundtouch,以便在录制声音时直接提供数据进行处理。这将使你的应用程序更好
参考资料
您可以使用AVAudioEngine、AVAudioPlayerNode播放音高变化的声音。下面给出了测试代码示例
@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];
}
确保path变量具有有效的文件路径
注意:此代码在实际设备上进行了测试,在我的项目中运行良好。别忘了添加CoreAudio.framework、AVFoundation.framework。您可以使用AVAudioEngine、AVAudioPlayerNode播放音高变化的声音。下面给出了测试的示例代码
@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];
}
确保path变量具有有效的文件路径
注意:这段代码在实际设备上进行了测试,在我的项目中运行良好。别忘了添加CoreAudio.framework、AVFoundation.framework。你好,madan,你的问题是音高是什么意思?@CNSivakumar:很抱歉,不清楚,音高意味着将调子改为其他角色。@MadanMohan先生,我也遇到了同样的问题。你找到解决办法了吗?你能帮我看一下吗?你好,madan,你的问题是音高是什么意思?@CNSivakumar:很抱歉不清楚,音高意味着把调子换成其他角色。@MadanMohan先生,我也有同样的问题。你找到解决办法了吗?你能帮我怎么做吗?好的,它会改变音调吗?我的意思是如果我们录男性的声音,那么我可以播放女性的声音。我认为这不是为满足你的需要而量身定做的。你必须根据你的需要来定制。凯,它会改变音调吗?我的意思是,如果我们录制男声,那么我可以播放女声。我认为这不是为满足你的需要而量身定做的。您必须根据自己的需要进行定制