OC 錄音機(jī) 功能的實(shí)現(xiàn)

屏幕快照 2017-08-21 下午7.38.44.png

如圖所示 首先拖拽 3個(gè)button控件與兩個(gè)lable控件,并寫上title,然后將其關(guān)聯(lián)

屏幕快照 2017-08-21 下午7.40.34.png

接下來 進(jìn)入代碼的階段

首先 要導(dǎo)入AVFoundation框架,并設(shè)置代理 以及創(chuàng)建一些全局變量方便以后的調(diào)用

#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>

@interface ViewController ()<AVAudioRecorderDelegate>
{
    AVAudioRecorder *_audioRecoder;//音頻錄音機(jī)
    AVAudioPlayer *_avplayer;//音頻播放器
    NSTimer *_timer;//定時(shí)器
    int      _count;//保存數(shù)量
    BOOL     _isSwitch;//是否開關(guān)
    
}

此處是關(guān)聯(lián)過來的方法以及文件的存儲(chǔ)路徑

// 開始錄制
@property (weak, nonatomic) IBOutlet UIButton *btnStart;
// 顯示時(shí)間
@property (weak, nonatomic) IBOutlet UILabel *showTime;
// 回放屬性
@property (weak, nonatomic) IBOutlet UIButton *btnPlayBack;
// 文件路徑
@property(nonatomic,copy)NSString *documentsPath;

// 開始錄制
- (IBAction)startRecording:(id)sender;

// 停止錄制
- (IBAction)stopRecording:(id)sender;

// 回放錄音
- (IBAction)playBackRecording:(id)sender;


注意在 拖拽按鈕的時(shí)候 我們需要將其Connection處改成Action在進(jìn)行關(guān)聯(lián),這樣的操作可以方便我們?cè)诎粹o的方法里直接書寫代碼

在viewDidLoad中進(jìn)行以下的書寫

- (void)viewDidLoad
{
    [super viewDidLoad];
    _isSwitch = YES;
}

開始按鈕

// 開始錄制
- (IBAction)startRecording:(id)sender
{
    
    // 判斷錄音控制器是否為空或者正在錄制
    if (_audioRecoder == nil && _audioRecoder.isRecording)
    {
        // 設(shè)置控制器停止錄制
        [_audioRecoder stop];
        // 設(shè)置按鈕的標(biāo)題為開始錄制
        [_btnStart setTitle:@"開始錄制" forState:UIControlStateNormal];
        [_timer invalidate];
        _timer = nil;
    }
    else
    {
        _count = 0;
        _timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(repeatShowTime:) userInfo:@"admin" repeats:YES];
        
#pragma mark 下面設(shè)置錄音的參數(shù)和錄音文件的保存路徑等信息
        //獲取音頻文件的保存路徑
        NSString *destinationStr = [[self documentsPath] stringByAppendingPathComponent:@"sound.wav"];
        NSURL *destinationUrl = [NSURL fileURLWithPath:destinationStr];
        //創(chuàng)建一個(gè)Dictionary顽悼,用于保存錄制屬性
        NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc] init];
        //設(shè)置錄制音頻的格式
        [recordSettings setObject:[NSNumber numberWithInt:kAudioFormatLinearPCM]forKey:AVFormatIDKey];
        //設(shè)置錄制音頻的采樣率
        //        [recordSettings setObject:[NSNumber numberWithFloat:@"1".floatValue] forKey:AVSampleRateKey];
        //設(shè)置錄制音頻的通道數(shù)
        [recordSettings setObject:[NSNumber numberWithInt:(_isSwitch =/* DISABLES CODE */ (YES) ?2:1)]forKey:AVNumberOfChannelsKey];
        //設(shè)置錄制音頻采用高位優(yōu)先的記錄格式
        [recordSettings setObject:[NSNumber numberWithBool:YES]forKey:AVLinearPCMIsBigEndianKey];
        //設(shè)置采樣信號(hào)采用浮點(diǎn)數(shù)
        [recordSettings setObject:[NSNumber numberWithBool:YES]forKey:AVLinearPCMIsFloatKey];
        NSError *recorderSetupError =nil;
        
#pragma mark 到這里開始實(shí)例化錄音對(duì)象
        //初始化AVAudioRecorder
        _audioRecoder = [[AVAudioRecorder alloc] initWithURL:destinationUrl settings:recordSettings error:&recorderSetupError];
        _audioRecoder.delegate =self;
        [_audioRecoder record];
        //設(shè)置單個(gè)按鈕的狀態(tài)為錄音
        [_btnStart setTitle:@"正在錄音"forState:UIControlStateNormal];
    }
}

停止按鈕

// 停止錄制
- (IBAction)stopRecording:(id)sender
{
    [_audioRecoder stop];
    [_btnStart setTitle:@"開始錄制" forState:UIControlStateNormal];
    // 設(shè)置計(jì)時(shí)器為初始值
    if (_timer)
    {
        [_timer invalidate];
        _timer =nil;
    }
    _count = 0;
    _showTime.text = @"00:00";
}


回放按鈕

// 回放錄音
- (IBAction)playBackRecording:(id)sender
{
    // 獲取音頻文件的保存路徑
   NSString *destinationString = [[self documentsPath] stringByAppendingPathComponent:@"sound.wav"];
    NSURL *url = [NSURL fileURLWithPath:destinationString];
    //創(chuàng)建AVAudioPlayer對(duì)象
    _avplayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    //開始播放
    [_avplayer play];
    _btnPlayBack.backgroundColor=[UIColor greenColor];
}

獲取文件的路徑

//獲取Documents目錄路徑
-(NSString *)documentsPath
{
    
    if (!_documentsPath)
    {
        
        NSArray *searchPath =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
        _documentsPath = searchPath[0];
        
    }
    
    return _documentsPath;
}

錄音中的代理方法

#pragma mark- 錄制音頻的代理方法
- (void)audioRecorderBeginInterruption:(AVAudioRecorder *)recorder
{
    NSLog(@"---->被中斷巩趁!");
}
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)aRecorder successfully:(BOOL)flag
{
    if(flag)
    {
        NSLog(@"---->錄制完成Vā松逊!");
    }
}
- (void)repeatShowTime:(NSTimer *)tempTimer
{
    
    _count++;
    //設(shè)置在文本框上顯示時(shí)間纪蜒;
    _showTime.text = [NSString stringWithFormat:@"%02d:%02d",_count/60,_count%60];
}

- (void)dealloc
{  //銷毀NSTimer</span>
    if (_timer)
    {
        [_timer invalidate];
        _timer = nil;
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌垦藏,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伞访,死亡現(xiàn)場(chǎng)離奇詭異掂骏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)厚掷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門弟灼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冒黑,你說我怎么就攤上這事田绑。” “怎么了抡爹?”我有些...
    開封第一講書人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵辛馆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng)昙篙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任诱咏,我火速辦了婚禮苔可,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘袋狞。我一直安慰自己焚辅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開白布苟鸯。 她就那樣靜靜地躺著同蜻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪早处。 梳的紋絲不亂的頭發(fā)上湾蔓,一...
    開封第一講書人閱讀 49,856評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音砌梆,去河邊找鬼默责。 笑死,一個(gè)胖子當(dāng)著我的面吹牛咸包,可吹牛的內(nèi)容都是我干的桃序。 我是一名探鬼主播,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼烂瘫,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼媒熊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坟比,我...
    開封第一講書人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤芦鳍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后温算,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怜校,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年注竿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茄茁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡巩割,死狀恐怖裙顽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宣谈,我是刑警寧澤愈犹,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響漩怎,放射性物質(zhì)發(fā)生泄漏勋颖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一勋锤、第九天 我趴在偏房一處隱蔽的房頂上張望饭玲。 院中可真熱鬧,春花似錦叁执、人聲如沸茄厘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)次哈。三九已至,卻和暖如春吆录,著一層夾襖步出監(jiān)牢的瞬間窑滞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工径筏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留葛假,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓滋恬,卻偏偏與公主長(zhǎng)得像聊训,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恢氯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,806評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)带斑、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評(píng)論 4 62
  • 黃梅縣汪可受勋拟,記得自己三輩子勋磕。 第一世,豪強(qiáng)敢靡,橫行鄉(xiāng)里挂滓,搶人家的騾子。 閻王為他的霸道感到憤怒啸胧,罰他第二輩子做騾子...
    Hushering閱讀 420評(píng)論 0 0
  • (一) “這種生活模式給人以安詳親切之感。它使人想到一條平靜的小河陷谱,蜿蜒流過綠茸茸的牧場(chǎng)烙博,與郁郁的樹蔭交相掩映,直...
    伍月六閱讀 736評(píng)論 0 4
  • 把我做成男人 線條粗獷 性格豪放 卻又不給與之相對(duì)應(yīng)的 堅(jiān)忍 如果我的前世是水 今生 無(wú)論如何也該是一個(gè)女人 婀娜...
    江城妖怪閱讀 395評(píng)論 0 0