본문 바로가기
ios 뽀개기/objective-c

AVFoundation을 이용한 녹음 재생하기

by 인생여희 2018. 12. 17.
반응형

AVFoundation을 이용한 녹음 재생하기



.h




#import <UIKit/UIKit.h>


@interface ViewController : UIViewController


//녹음버튼 + 멈춤

@property (strong, nonatomic) IBOutlet UIButton *recordPauseButton;


//정지 버튼

@property (strong, nonatomic) IBOutlet UIButton *stopButton;


//플레이 버튼

@property (strong, nonatomic) IBOutlet UIButton *playButton;


//녹음 버튼  + 멈춤버튼 눌렀을때

- (IBAction)recordPauseTapped:(id)sender;


//정지버튼 눌렀을때

- (IBAction)stopTapped:(id)sender;


//작동버튼 눌렀을때

- (IBAction)playTapped:(id)sender;



@end



.m



/*

 1.라이브러리 추가

 2. 라이브러리 임포트

 3.델리게이트 프로토콜 상속

 4. url지정 , 오디오세션 설정, 오디오 레코더 초기상태 구현

 5. 코드작성

 */


#import <AVFoundation/AVFoundation.h>

#import "ViewController.h"


@interface ViewController () <AVAudioRecorderDelegate,AVAudioPlayerDelegate>

{

    AVAudioRecorder *recorder;

    AVAudioPlayer *player;

}

@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

   

    

    //앱이 로드될때 플레이/스탑 버튼 사용불가

    [self.stopButton setEnabled:NO];

    [self.playButton setEnabled:NO];

    

    //오디오 파일 셋

    //녹음을 저장하기 위한 파일 url

    NSArray *pathComponents = [NSArray arrayWithObjects:

                               [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject], @"MyAudioMemo.m4a",

                               nil];

    

    NSURL *outputFileURL = [NSURL fileURLWithPathComponents:pathComponents];

    

    

    //오디오 세션 셋업

  AVAudioSession *session = [AVAudioSession sharedInstance];

   //오디오 입력과 출력 모두 허용

    [session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

    

    //레코더 정의

  NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc]init];

    

    [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];

    [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];

    [recordSetting setValue:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey];

    

    //레코더 초기화 + 준비

    recorder = [[AVAudioRecorder alloc] initWithURL:outputFileURL settings:recordSetting error:NULL];

    recorder.delegate = self;

    recorder.meteringEnabled = YES;

    [recorder prepareToRecord];

    

    

}



- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


//녹음

- (IBAction)recordPauseTapped:(id)sender {

    //플레이어가 작동 중이면 멈춤

    if (player.playing) {

        [player stop];

    }

    

    //레코딩 상태가 아니면

    if (!recorder.recording) {

        AVAudioSession *session = [AVAudioSession sharedInstance];

        [session setActive:YES error:nil];

        

        //레코드 시작

        [recorder record];

        [_recordPauseButton setTitle:@"정지" forState:UIControlStateNormal];

        

    }else{

        

        [recorder pause];

        [_recordPauseButton setTitle:@"녹음" forState:UIControlStateNormal];

        

    }

    

    [_stopButton setEnabled:YES];

    [_playButton setEnabled:NO];

    

}



//정지

- (IBAction)stopTapped:(id)sender {

    [recorder stop];

  AVAudioSession *audioSession = [AVAudioSession sharedInstance];

    [audioSession setActive:NO error:nil];

}



//작동

- (IBAction)playTapped:(id)sender {

    

    if (!recorder.recording) {

        player = [[AVAudioPlayer alloc]initWithContentsOfURL:recorder.url error:nil];

        [player setDelegate:self];

        [player play];

    }

    

    

}




//델리게이트 메소드 - 녹음 완료

//녹음이 끝나면 녹음을 다시 할수 있게 녹음 버튼 활성화 + 플레이 버튼 활성화

- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag{

    [_recordPauseButton setTitle:@"녹음" forState:UIControlStateNormal];

    [_stopButton setEnabled:NO];

    [_playButton setEnabled:YES];

    

}




//델리게이트 메소드 - 플레이완료

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{

    

  UIAlertView *alert  = [[UIAlertView alloc] initWithTitle:@"완료!"

                                                   message:@"녹음파일 재생완료!"

                                                  delegate:nil cancelButtonTitle:@"확인"

                                         otherButtonTitles:nil];

    [alert show];

    

}











@end



반응형

댓글