読書ノート---オーディオデバイスアクセス


オーディオアプリケーションを開発し、主に2つのフレームワークAVFoundationとCoreAudioがある.
CoreAudioの内容が多くて使うのも面倒で、彼は4つの主要なオーディオ処理エンジンAPI:System Sound、Audio Unit、Audio QueueとOpenALを持っています
System SoundそれはCのオーディオAPIに基づいて、システムの音を再生することができて、それは短い音を再生して、30 sを超えません.
Audio Unitは最下層の音声生成器で、元のオーディオサンプルを生成し、オーディオ値を出力バッファに配置する.Audio Unitは、複数種類の音声を混合することも可能である.
Audio Queueは、オーディオの録画、再生、一時停止、サイクル、同期処理を提供することができる.
OpenALは位置変化に基づく3 D音声の工業化標準APIであり、彼のAPIインタフェースはOpenGLと非常に似ている.主にゲームの音響処理に応用する.
Audio Fileサービスこのサービスは各種の異なるオーディオ容器フォーマットを処理する任務を簡略化した.異なる点を考慮せずに、さまざまなサポートオーディオストリームを読み書きできます.
Audio File Streamサービスは、ネットワークのオーディオストリームデータを読み書きし、1つのストリームからデータを読み取る場合、このサービスを使用してこのストリームを解析し、そのフォーマットを決定し、最終的にオーディオパケットを1つのオーディオキューに渡すか、または自分で処理する.
Audio Converterサービスによるオーディオデータフォーマットの変換
Audio Sessionサービスオーディオリソースとシステムの関係の調整
AVFoundationフレームワークでは、AVAudioPlayerクラスは一般的なオーディオ再生を実現することができ、5 sを超える音声を再生するために用いる、ローカル音声のみを再生することができ、ネットワークメディアファイルを再生することができない.
<span style="font-size:18px;">- (IBAction)play:(id)sender {
    
    NSLog(@"player %i",player.isPlaying);
    
    NSError *error = nil;
    if (player == nil) {
        player = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"1" ofType:@"mp3"]] error:&error];
        player.delegate = self;
    }
    
    if (error) {
        NSLog(@"%@",[error description]);
    }else {
        [player play];
    }
}

- (IBAction)pause:(id)sender {
    
    if (player&&player.isPlaying) {
        [player pause];
    }
    
}

- (IBAction)stop:(id)sender {

    if (player) {
        [player stop];
        player.delegate = nil;
        player = nil;
    }
    
}

#pragma delegate

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
    NSLog(@"    ");
}

- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error{
    NSLog(@"error : %@",[error localizedDescription]);
}

- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags{
    NSLog(@"    ");
}

- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player{
    NSLog(@"    ");
}

</span>

レコーディング


- (NSString *)doc{
//    NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
//    return [arr objectAtIndex:0];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                         NSUserDomainMask, YES);
    return [paths objectAtIndex:0];
}

- (IBAction)record:(id)sender {
    
    if (recoeder == nil) {
        //      
        NSString *filePath = [NSString stringWithFormat:@"%@/rec_audio.caf",[self doc]];
        NSURL *fileUrl = [NSURL fileURLWithPath:filePath];
        
        NSError *error = nil;
        
        
        [[AVAudioSession sharedInstance]setCategory:AVAudioSessionCategoryRecord error:&error];
        [[AVAudioSession sharedInstance] setActive:YES error:&error];
        
        NSMutableDictionary *settings = [NSMutableDictionary dictionary];
        [settings setValue:[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];//          
        [settings setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];//       
        [settings setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];//      
        [settings setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];//      
        [settings setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];//                 
        [settings setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];//            
        
        recoeder = [[AVAudioRecorder alloc]initWithURL:fileUrl settings:settings error:&error];
        recoeder.delegate = self;
        
    }
    
    if (recoeder.isRecording) {
        return;
    }
    
    if (player && player.isPlaying) {
        [player stop];
    }

    [recoeder record];
    
    self.label.text = @"   ...";
}

- (IBAction)stop:(id)sender {

    self.label.text = @"  ...";

    if (recoeder.isRecording) {
        [recoeder stop];
        recoeder.delegate = nil;
        recoeder = nil;
    }
    
    if (player.isPlaying) {
        [player stop];
    }
}

- (IBAction)play:(id)sender {

    if (recoeder.isRecording) {
        [recoeder stop];
        recoeder.delegate = nil;
        recoeder = nil;
    }

    if (player.isPlaying) {
        [player stop];
    }
    
    NSString *filePath =
    [NSString stringWithFormat:@"%@/rec_audio.caf", [self doc]];
    NSURL *fileUrl = [NSURL fileURLWithPath:filePath];
    
    NSError *error = nil;
    
    //AVAudioSession     AVAudio Session   ,               .AVAudioSession               ,                
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error];
    
    //      ,              
    [[AVAudioSession sharedInstance] setActive:YES error:&error];
    player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileUrl error:&error];
    
    if(error) {
        NSLog(@"%@",[error description]);
    } else {
        [player play];
        _label.text = @"  ...";
    }

}

#pragma delegate

- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag{
    NSLog(@"    ");
}

- (void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)recorder error:(NSError *)error{
    NSLog(@"       %@",[error localizedDescription]);
}

- (void)audioRecorderBeginInterruption:(AVAudioRecorder *)recorder{
    NSLog(@"    ");
}

- (void)audioRecorderEndInterruption:(AVAudioRecorder *)recorder withOptions:(NSUInteger)flags{
    NSLog(@"    ");
}



より多くの乾物は、原作をサポートしてください.http://item.jd.com/11436547.html