0

私はピアノのようなアプリケーションを開発しており、両方のライブラリを試しました:

AudioToolbox/AudioToolbox.h

-(void)playSound :(NSString *)fName :(NSString *) ext{
    SystemSoundID audioEffect;
    NSString *path = [[NSBundle mainBundle] pathForResource : fName ofType :ext];
    if ([[NSFileManager defaultManager] fileExistsAtPath : path]) {
        NSURL *pathURL = [NSURL fileURLWithPath: path];
        AudioServicesCreateSystemSoundID((__bridge CFURLRef) pathURL, &audioEffect);
        AudioServicesPlaySystemSound(audioEffect);
    }
    else {
        NSLog(@"error, file not found: %@", path);
    }
}

次に、次のようなもので呼び出すだけです

[self playSound:@"c_sharp" :@"mp3"];

このアプローチの問題は、playSoundメソッドを呼び出すボタンを押すと、1 ~ 2 秒の遅延が発生することでした。また、AudioServicesPlaySystemSoundはシステム ボリュームで再生されているように見えますが、そのオプションが無効になっている場合、ボリューム ロッカーで制御することはできません。


サウンドを再生する別のアプローチも試しました

AVFoundation/AVFoundation.h

@property (nonatomic, strong) AVAudioPlayer *audioPlayer;
-(void)viewDidLoad
{
    [super viewDidLoad];

    NSBundle *mainBundle = [NSBundle mainBundle];
    NSString *fileC2 = [mainBundle pathForResource:@"c_sharp" ofType:@"mp3"];
    NSData *soundC2 = [NSData dataWithContentsOfFile:fileC2];
    NSError *error = nil;
    self.audioPlayer = [[AVAudioPlayer alloc] initWithData:soundC2
                                                     error:&error];
    [self.audioPlayer prepareToPlay];
}

次に、サウンドを再生するには、

- (IBAction)c_sharp_press:(UIButton *)sender {
    [self.audioPlayer play];
}

このアプローチの問題点は、一度に1 つのサウンドしか再生できないことです。別の同様の音を追加する代わりに、同じピアノのキーを押しても、最初の音が再生されるまで何もしません。小さな 1/2 秒の遅延もあります。


私の質問は:

ピアノのキーボードを実装するために使用するライブラリは次のとおりです。

  1. 音の再生に遅延がないか、または目立たない。
  2. サウンドはボリューム ロッカーによって制御されます。
  3. 一度に複数のサウンドを再生できます。
4

1 に答える 1

1

Apple のloadPresetDemoのサンプル コードを参照してください。このコードはAUSampler Unit、カスタム オーディオ クリップで を使用する方法を示しています。これは、応答性の高い再生、低遅延、メモリのプリロード、および使用などのために最適化されているため、楽器タイプのアプリを作成するための最良のアプローチですAUSampler。iOS でオーディオを再生する他の方法は、短いサウンドを立て続けに再生するのにはあまり適していません。

于 2013-06-08T23:43:45.107 に答える