iOS中調用系統錄音功能及其播放


最近做的項目中,用到了錄音的功能,簡單記錄一下。

我的想法是:通過重寫button的點擊事件,來達到錄音的目的。

/*----------------------------------【錄音】-----------------------------*/

首先,需要新建文件,並繼承於UIButton,暫且命名為 TDRecoedButton;

在.h文件中:

#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioToolbox.h>
#import <AVFoundation/AVFoundation.h>


typedef void (^successRecordToSend)(NSInteger time,NSURL *url);
typedef void (^faildRecordToSend)(NSString * reason);

@interface TDRecoedButton : UIButton<AVAudioRecorderDelegate>
{
    AVAudioRecorder *recorder;  //錄音的對象
    NSTimer *timer;        //時間
    NSURL *urlPlay;        //保存路徑
}

//錄音並保存成功
@property (nonatomic,copy) successRecordToSend successBlock;
-(void)setBtnSuccessRecord:(successRecordToSend)sendBlock;

//錄音失敗及返回reason方法
@property (nonatomic,copy) faildRecordToSend faildBlock;
-(void)setBtnFaildRecord:(faildRecordToSend)sendBlock;

 

在.m文件中:

#import "TDRecoedButton.h"
#define reason @"錄音時間太短!"

@implementation TDRecoedButton

-(instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        [self audio];
        [self setBackgroundImage:[UIImage imageNamed:@"icon_voice_normal"] forState:UIControlStateNormal];
        [self setBackgroundImage:[UIImage imageNamed:@"icon_voice_pressed"] forState:UIControlStateHighlighted];
        [self addTarget:self action:@selector(btnDown:) forControlEvents:UIControlEventTouchDown];
        [self addTarget:self action:@selector(btnUp:) forControlEvents:UIControlEventTouchUpInside];
        [self addTarget:self action:@selector(btnDragUp:) forControlEvents:UIControlEventTouchDragExit];
    }
    return self;
}

- (IBAction)btnDown:(id)sender
{
    //創建錄音文件,准備錄音
    if ([recorder prepareToRecord]) {
        //開始
        [recorder record];
    }
    
    //設置定時檢測
//    timer = [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(detectionVoice) userInfo:nil repeats:YES];
}
- (IBAction)btnUp:(id)sender
{
    NSInteger cTime = recorder.currentTime;
    if (cTime > 1) {//如果錄制時間<1 不發送
        NSLog(@"發出去");
        if (_successBlock) {
            _successBlock(cTime,urlPlay);
        }
    }else {
        //刪除記錄的文件
        [recorder deleteRecording];
        //刪除存儲的
        if (_faildBlock) {
            _faildBlock(reason);
        }
    }
    [recorder stop];
    [timer invalidate];
}
- (IBAction)btnDragUp:(id)sender
{
    //刪除錄制文件
    [recorder deleteRecording];
    [recorder stop];
    [timer invalidate];
    
    NSLog(@"取消發送");
}

-(void)audio
{
    //錄音設置
    NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc]init];
    //設置錄音格式  AVFormatIDKey==kAudioFormatLinearPCM
    [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
    //設置錄音采樣率(Hz) 如:AVSampleRateKey==8000/44100/96000(影響音頻的質量)
    [recordSetting setValue:[NSNumber numberWithFloat:44100] forKey:AVSampleRateKey];
    //錄音通道數  1 或 2
    [recordSetting setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];
    //線性采樣位數  8、16、24、32
    [recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
    //錄音的質量
    [recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityHigh] forKey:AVEncoderAudioQualityKey];
    
    NSString *strUrl = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/byingRecord.aac", strUrl]];
    NSLog(@"*********url:%@",url);
    urlPlay = url;
    
    NSError *error;
    //初始化
    recorder = [[AVAudioRecorder alloc]initWithURL:url settings:recordSetting error:&error];
    //開啟音量檢測
    recorder.meteringEnabled = YES;
    recorder.delegate = self;
}

-(void)setBtnSuccessRecord:(successRecordToSend)sendBlock
{
    self.successBlock = sendBlock;
}
-(void)setBtnFaildRecord:(faildRecordToSend)sendBlock
{
    self.faildBlock = sendBlock;
}

 

這樣,重寫的button就成功了,在別的控制器中,導入頭文件,生成對象,就可以錄音了。

但是,這樣寫,在模擬器上運行是完全ok的,當我跑真機的時候,就一直報錯,於是,我找了一些帖子,找到了解決辦法。

解決辦法:

在實例化record之前,加入以下這段代碼:

AVAudioSession *session = [AVAudioSession sharedInstance];
    NSError *setCategoryError = nil;
    [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&setCategoryError];
    if(setCategoryError){
        NSLog(@"%@", [setCategoryError description]);
        if (_faildBlock) {
            _faildBlock([setCategoryError description]);
        }
    }

這樣就可以在真機上運行了。

 

/*----------------------------------【播放】-----------------------------*/

播放相對就簡單了,主要就是找到存儲的路徑:

首先,定義一個對象:

@property (nonatomic,strong) AVAudioPlayer * avPlay;        /*播放*/

@property (nonatomic,strong) NSURL * urlPlay;                /*播放路徑*/

在播放按鈕的點擊事件中,加入此方法:

#pragma mark - 點擊播放錄音
-(void)pressRecordPlayBtn:(id)sender
{
    if (self.avPlay.playing) {
        [self.avPlay stop];
        return;
    }
    AVAudioPlayer *player = [[AVAudioPlayer alloc]initWithContentsOfURL:_urlPlay error:nil];//_urlPlay是保存錄音的路徑
    self.avPlay = player;
    [self.avPlay play];
}

這樣,就可以實現錄音和播放的功能了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM