Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在iphone sdk中设置音频文件或录制的音频文件的音高?_Iphone_Objective C_Cocoa Touch_Audio_Pitch - Fatal编程技术网

如何在iphone sdk中设置音频文件或录制的音频文件的音高?

如何在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播放,将得到原始音高的一半 当然,这种幼稚的方法包括更改文件的持续时间和其他与声音相关的工件。如果你需要一些不那么幼稚的东西,你必须自己实现一个基音变换算法,这是一个巨大的主题——我建议

我正在录制一个文件或我有音频文件,我想更改音高并播放音频文件。如何在使用objective-c的iphone程序中设置音调

请帮我解决这个问题

谢谢,,
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先生,我也有同样的问题。你找到解决办法了吗?你能帮我怎么做吗?好的,它会改变音调吗?我的意思是如果我们录男性的声音,那么我可以播放女性的声音。我认为这不是为满足你的需要而量身定做的。你必须根据你的需要来定制。凯,它会改变音调吗?我的意思是,如果我们录制男声,那么我可以播放女声。我认为这不是为满足你的需要而量身定做的。您必须根据自己的需要进行定制