・iOS, Mac でのオーディオ録音のためのObjective-C インタフェースを提供するAVAudioRecorderの使い方(Mac OS Xでも同じです)
※Mac OS Xの場合, 録音に利用するデバイスの選択はできません。(デフォルトになる)デバイスを選択する場合は, Audio Queue Service を利用します。iOSはマイク入力は1つです今のところ。
AVAudioRecorder を利用すると以下のようなことができるらしいです。
・録音
・長さ(duration)を決めて録音
・PauseとResume
・レベルで与えられた入力のオーディオレベルを取得する
・ファイルとして保存する
すこし調べてみて出来そうもなかったこと
・録音の入力(マイクの入力)音量の変更(iOS)
※ちなみにMac OS Xならできます
・サンプル : 録音してファイルとして保存, 再生もできます
※ちなみに, Simulator でも動作します。私はMac Book Pro を使っていますが, マイクついています。さらに仕事で, Mac を使っていますが, こちらもマイクがついています。マイクが付いていれば録音のテストをSimulator 上でもできます。
- RecordViewController.h
#import "ViewController.h"
#import <AudioToolbox/AudioToolbox.h>
@interface RecordViewController : ViewController
@property (nonatomic)AVAudioRecorder *recorder;
@property (nonatomic)AVAudioSession *session;
@property (nonatomic)AVAudioPlayer *player;
@property (weak, nonatomic) IBOutlet UIButton *recordButton;
- (IBAction)recordClick:(id)sender;
@property (weak, nonatomic) IBOutlet UIButton *playButton;
- (IBAction)playClick:(id)sender;
@end
AudioSessionと AVAudioRecorder, AVAudioPlayerを宣言しています。
ARC用です。
//
//  RecordViewController.m
//  AudioSamples
//
//  Created by atmarkplant on 13/02/10.
//  Copyright (c) 2013年 atmarkplant. All rights reserved.
//
#import "RecordViewController.h"
@interface RecordViewController ()
@end
- RecordViewController.m
@implementation RecordViewController
@synthesize session;
@synthesize recorder;
@synthesize player;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
 // Do any additional setup after loading the view.
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
#pragma mark - Helpers
-(NSMutableDictionary *)setAudioRecorder
{
    NSMutableDictionary *settings = [[NSMutableDictionary alloc] init];
    [settings setValue:[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
    [settings setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
    [settings setValue:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey];
    [settings setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
    [settings setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
    [settings setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];
    return settings;
}
-(void)recordFile
{
    // Prepare recording(Audio session)
    NSError *error = nil;
    self.session = [AVAudioSession sharedInstance];
    if ( session.inputAvailable )   // for iOS6 [session inputIsAvailable]  iOS5
    {
        [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
    }
    if ( error != nil )
    {
        NSLog(@"Error when preparing audio session :%@", [error localizedDescription]);
        return;
    }
    [session setActive:YES error:&error];
    if ( error != nil )
    {
        NSLog(@"Error when enabling audio session :%@", [error localizedDescription]);
        return;
    }
    // File Path
    NSString *dir = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    NSString *filePath = [dir stringByAppendingPathComponent:@"test.caf"];
    NSURL *url = [NSURL fileURLWithPath:filePath];
   // recorder = [[AVAudioRecorder alloc] initWithURL:url settings:nil error:&error];
   recorder = [[AVAudioRecorder alloc] initWithURL:url settings:[self setAudioRecorder] error:&error];
    //recorder.meteringEnabled = YES;
    if ( error != nil )
    {
        NSLog(@"Error when preparing audio recorder :%@", [error localizedDescription]);
        return;
    }
    [recorder record];
}
-(void)stopRecord
{
    if ( self.recorder != nil && self.recorder.isRecording )
    {
        [recorder stop];
        self.recorder = nil;
    }
}
-(void)playRecord
{
    NSError *error = nil;
    // File Path
    NSString *dir = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    NSString *filePath = [dir stringByAppendingPathComponent:@"test.caf"];
    NSURL *url = [NSURL fileURLWithPath:filePath];
    if ( [[NSFileManager defaultManager] fileExistsAtPath:[url path]] )
    {
        self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
        if ( error != nil )
        {
            NSLog(@"Error %@", [error localizedDescription]);
        }
        [self.player prepareToPlay];
        [self.player play];
    }
}
- (IBAction)recordClick:(id)sender
{
    if ( self.recorder != nil && self.recorder.isRecording )
    {
        [self stopRecord];
        [self.recordButton setTitle:@"Record" forState:UIControlStateNormal];
    }
    else
    {
        [self recordFile];
        [self.recordButton setTitle:@"..." forState:UIControlStateNormal];
    }
}
- (IBAction)playClick:(id)sender
{
    [self playRecord];
}
@end
重要な部分は太字になっています。
-(NSMutableDictionary *)setAudioRecorder
では, 保存形式を入れています。 settingsの部分で入れていますが, nilにするとdefault の設定になります。 辞書式に設定を入れていきます。ここで保存形式などを細かく指定できます。
-(void)recordFile
で, 実際の処理をしています。処理手順はこんな感じです。
1. AudioSession をつくる
2. マイク入力が可能かどうかの確認
3. ファイルパスの設定
4. AVAudioRecorder の作成
5. record 開始
※caf って何? ということですが, caf はApple のwrapper です。中身はこれだけではわかりません。PCMかもしれないですし, MP4かもしれません。動画いう.avi みたいなコーデックのラッパーみたいなものでしょうか。
 
0 件のコメント:
コメントを投稿