我正在重新编码文件或我有音频文件我想更改音高并播放音频文件。如何在使用 Objective-c 的 iphone 程序中设置音高。
请帮我解决这个问题。
谢谢你,马丹·莫汉。
我正在重新编码文件或我有音频文件我想更改音高并播放音频文件。如何在使用 Objective-c 的 iphone 程序中设置音高。
请帮我解决这个问题。
谢谢你,马丹·莫汉。
你可以使用 soundtouch 开源项目来改变音高
这是链接:http ://www.surina.net/soundtouch/
将 soundtouch 添加到项目后,您必须将输入声音文件路径、输出声音文件路径和音高变化作为输入。
由于处理声音需要更多时间,因此最好修改soundtouch,以便在录制语音时直接提供数据进行处理。它将使您的应用程序更好。
参考
天真的方法是使用与用于记录文件的采样率相比不同的采样率来播放它。例如,如果文件是用 Fs=44100Hz 录制的,那么用 Fs=22050Hz 播放它会得到原始音高的一半。
当然,这种幼稚的方法涉及更改文件的持续时间以及其他与声音相关的工件。如果你需要一些不那么天真的东西,你必须自己实现一个音高变换算法,这是一个很大的话题——我建议你从pitch shift
谷歌搜索开始。
您可以使用 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];
}
确保路径变量具有有效的文件路径
注意::此代码在实际设备上进行了测试,并且在我的项目中运行良好。不要忘记添加 CoreAudio.framework , AVFoundation.framework。