【问题标题】:How to set pitch of an audio file or recorded audio file in iphone sdk?如何在 iphone sdk 中设置音频文件或录制的音频文件的音高?
【发布时间】:2011-04-19 09:26:04
【问题描述】:

我正在重新编码文件或我有音频文件我想更改音高并播放音频文件。如何在使用 Objective-c 的 iphone 程序中设置音高。

请帮我解决这个问题。

谢谢你, 马丹·莫汉。

【问题讨论】:

  • 你好,马丹在你的问题中是什么意思?
  • @CNSivakumar:抱歉不清楚,音高意味着将曲调换成其他角色。
  • @MadanMohan 先生,我遇到了同样的问题。你找到解决方案了吗?你能帮我看看怎么过去吗?

标签: iphone objective-c cocoa-touch audio pitch


【解决方案1】:

天真的方法是使用与用于录制文件的采样率不同的采样率来播放它。例如,如果文件是用 Fs=44100Hz 录制的,那么用 Fs=22050Hz 播放它会得到原始音高的一半。

当然,这种幼稚的方法涉及更改文件的持续时间以及其他与声音相关的工件。如果你需要一些不那么幼稚的东西,你必须自己实现一个音高变换算法,这是一个很大的话题——我建议你先在谷歌搜索pitch shift

【讨论】:

    【解决方案2】:

    你可以使用soundtouch开源项目来改变音高

    这是链接:http://www.surina.net/soundtouch/

    在项目中添加 soundtouch 后,您必须将输入声音文件路径、输出声音文件路径和音高变化作为输入。

    由于处理声音需要更多时间,因此最好修改soundtouch,以便在录制语音时直接提供数据进行处理。它将使您的应用程序变得更好。

    参考文献

    Real-time Pitch Shifting on the iPhone

    Create pitch changing code?

    【讨论】:

    • 好的,它会改变音调吗,我的意思是如果我们录制男性声音,那么我可以播放女性声音。
    • 我认为它不能满足您的需求。您必须根据需要对其进行自定义
    【解决方案3】:

    您可以使用 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 2013-07-30
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多