亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS多媒體音頻(下)-錄音及其播放的實例

2020-07-26 02:59:52
字體:
來源:轉載
供稿:網友

上一篇中總結了iOS中音效和音頻播放的最基本使用方法,其中音頻的播放控制是使用AVFoundation.framework框架中的AVAudioPlayer播放器對象來實現的,而這里音頻的錄制則是使用了同樣框架下的一個叫AVAudioRecorder的錄音機對象來實現,這兩個類的用法流程非常類似,類的屬性和方法也類似,例如:播放器中需要獲取音頻文件的url,而錄音機要在沙盒中Docuemnt目錄下創建一個音頻文件路徑url;

播放器有isPlaying變量判斷是否正在播放,錄音機中有isRecording變量表示是否正在錄制;currentTime在播放器中表示播放時間,在錄音機中則表示錄音時間;播放器通過prepareToPlay方法加載文件到緩沖區,錄音機通過prepareToRecord創建緩沖區;播放音頻有play方法,音頻錄制有record方法,另外都有pause暫停方法和stop停止方法等等,具體可直接打開兩個類的頭文件詳細了解。

這里實現最基本的錄音流程以及錄音過程的控制,并通過之前使用的AVAudioPlayer來播放錄制好的音頻。注意iOS錄制的音頻為caf格式,如果需要通用化可以通過lame等插件將caf格式音頻轉成mp3格式。

錄音

這里實現開始錄音,暫停,繼續以及停止錄音。

創建文件目錄

iOS沙盒內胡要有三個目錄:Documents目錄,tmp目錄以及Library目錄,其中Documents目錄用來存放用戶的應用程序數據,需要定期備份的數據要放在這里,和plist文件存儲一樣,我們要找到存放文件的路徑,然后在該路徑下放一個我們的文件,因此要自定義一個帶后綴的文件名,將獲得的路徑和文件名拼在一起記得到我們的文件的絕對路徑:

// 文件名#define fileName_caf @"demoRecord.caf"http:// 錄音文件絕對路徑@property (nonatomic, copy) NSString *filepathCaf;// 獲取沙盒Document文件路徑NSString *sandBoxPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];// 拼接錄音文件絕對路徑_filepathCaf = [sandBoxPath stringByAppendingPathComponent:fileName_caf];

創建音頻會話

錄音前要創建一個音頻會話,同時要設置錄音類型,提供的類型有以下幾種:

  • AVF_EXPORT NSString *const AVAudioSessionCategoryAmbient; // 用于錄制背景聲音,像雨聲、汽車引擎發動噪音等,可和其他音樂混合
  • AVF_EXPORT NSString *const AVAudioSessionCategorySoloAmbient; // 也是背景聲音,但其他音樂會被強制停止
  • AVF_EXPORT NSString *const AVAudioSessionCategoryPlayback; // 音軌
  • AVF_EXPORT NSString *const AVAudioSessionCategoryRecord; // 錄音
  • AVF_EXPORT NSString *const AVAudioSessionCategoryPlayAndRecord; // 錄音和回放
  • AVF_EXPORT NSString *const AVAudioSessionCategoryAudioProcessing; // 用于底層硬件編碼信號處理等
  • AVF_EXPORT NSString *const AVAudioSessionCategoryMultiRoute; // 內置硬件相關,iOS 6.0以上可用

常用的是AVAudioSessionCategoryPlayAndRecord類型,便于錄音后播放。

// 創建音頻會話AVAudioSession *audioSession=[AVAudioSession sharedInstance];// 設置錄音類別(這里選用錄音后可回放錄音類型)[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];[audioSession setActive:YES error:nil];

錄音設置

錄音前要根據需要對錄音進行一些相應的基本設置,例如錄音格式(LinearPCM)、采樣率、通道數等等,設置保存在一個字典內并作為初始化錄音機的一個參數。

// 錄音設置-(NSDictionary *)getAudioSetting{  // LinearPCM 是iOS的一種無損編碼格式,但是體積較為龐大  // 錄音設置信息字典  NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc] init];  // 錄音格式  [recordSettings setValue :@(kAudioFormatLinearPCM) forKey: AVFormatIDKey];  // 采樣率  [recordSettings setValue :@11025.0 forKey: AVSampleRateKey];  // 通道數(雙通道)  [recordSettings setValue :@2 forKey: AVNumberOfChannelsKey];  // 每個采樣點位數(有8、16、24、32)  [recordSettings setValue :@16 forKey: AVLinearPCMBitDepthKey];  // 采用浮點采樣  [recordSettings setValue:@YES forKey:AVLinearPCMIsFloatKey];  // 音頻質量  [recordSettings setValue:@(AVAudioQualityMedium) forKey:AVEncoderAudioQualityKey];  // 其他可選的設置  // ... ...  return recordSettings;}

創建錄音機對象

錄音機對象的創建主要是利用上面的保存路徑和錄音設置進行初始化得到:

// 懶加載錄音機對象get方法- (AVAudioRecorder *)audioRecorder {  if (!_audioRecorder) {    // 保存錄音文件的路徑url    NSURL *url = [NSURL URLWithString:_filepathCaf];    // 創建錄音格式設置setting    NSDictionary *setting = [self getAudioSetting];    // error    NSError *error=nil;    _audioRecorder = [[AVAudioRecorder alloc]initWithURL:url settings:setting error:&error];    _audioRecorder.delegate = self;    _audioRecorder.meteringEnabled = YES;// 監控聲波    if (error) {      NSLog(@"創建錄音機對象時發生錯誤,錯誤信息:%@",error.localizedDescription);      return nil;    }  }  return _audioRecorder;}

錄音控制方法

錄音過程控制主要是開始錄音、暫停、繼續和停止錄音,其中開始錄音和繼續錄音都是record方法。

// 開始錄音或者繼續錄音- (IBAction)startOrResumeRecord {  // 注意調用audiorecorder的get方法  if (![self.audioRecorder isRecording]) {    // 如果該路徑下的音頻文件錄制過則刪除    [self deleteRecord];    // 開始錄音,會取得用戶使用麥克風的同意    [_audioRecorder record];  }}// 錄音暫停- (IBAction)pauseRecord {  if (_audioRecorder) {    [_audioRecorder pause];  }}// 結束錄音- (IBAction)stopRecord {  [_audioRecorder stop];}

錄音播放

錄音的播放很簡單,就是之前AVAudioPlayer音頻播放的簡單應用,播放的路徑即我們錄音時創建好的音頻路徑。但這里注意為了保證每次都播放最新錄制的音頻,播放器的get方法要每次重新創建初始化。

// audioPlayer懶加載getter方法- (AVAudioPlayer *)audioPlayer {  _audioRecorder = NULL; // 每次都創建新的播放器,刪除舊的  // 資源路徑  NSURL *url = [NSURL fileURLWithPath:_filepathCaf];  // 初始化播放器,注意這里的Url參數只能為本地文件路徑,不支持HTTP Url  NSError *error = nil;  _audioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:&error];  //設置播放器屬性  _audioPlayer.numberOfLoops = 0;// 不循環  _audioPlayer.delegate = self;  _audioPlayer.volume = 0.5; // 音量  [_audioPlayer prepareToPlay];// 加載音頻文件到緩存【這個函數在調用play函數時會自動調用】  if(error){    NSLog(@"初始化播放器過程發生錯誤,錯誤信息:%@",error.localizedDescription);    return nil;  }  return _audioPlayer;}// 播放錄制好的音頻- (IBAction)playRecordedAudio {  // 沒有文件不播放  if (![[NSFileManager defaultManager] fileExistsAtPath:self.filepathCaf]) return;  // 播放最新的錄音  [self.audioPlayer play];}

完整源碼和Demo下載

//// ViewController.m// IOSRecorderDemo//// Created by Xinhou Jiang on 29/12/16.// Copyright © 2016年 Xinhou Jiang. All rights reserved.//#import "ViewController.h"#import <AVFoundation/AVFoundation.h>// 文件名#define fileName_caf @"demoRecord.caf"@interface ViewController ()// 錄音文件絕對路徑@property (nonatomic, copy) NSString *filepathCaf;// 錄音機對象@property (nonatomic, strong) AVAudioRecorder *audioRecorder;// 播放器對象,和上一章音頻播放的方法相同,只不過這里簡單播放即可@property (nonatomic, strong) AVAudioPlayer *audioPlayer;// 用一個processview顯示聲波波動情況@property (nonatomic, weak) IBOutlet UIProgressView *processView;// 用一個label顯示錄制時間@property (nonatomic, weak) IBOutlet UILabel *recordTime;// UI刷新監聽器@property (nonatomic, strong) NSTimer *timer;@end@implementation ViewController- (void)viewDidLoad {  [super viewDidLoad];  // 初始化工作  [self initData];}// 初始化- (void)initData {  // 獲取沙盒Document文件路徑  NSString *sandBoxPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];  // 拼接錄音文件絕對路徑  _filepathCaf = [sandBoxPath stringByAppendingPathComponent:fileName_caf];  // 1.創建音頻會話  AVAudioSession *audioSession=[AVAudioSession sharedInstance];  // 設置錄音類別(這里選用錄音后可回放錄音類型)  [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];  [audioSession setActive:YES error:nil];  // 2.開啟定時器  [self timer];}#pragma mark -錄音設置工具函數// 懶加載錄音機對象get方法- (AVAudioRecorder *)audioRecorder {  if (!_audioRecorder) {    // 保存錄音文件的路徑url    NSURL *url = [NSURL URLWithString:_filepathCaf];    // 創建錄音格式設置setting    NSDictionary *setting = [self getAudioSetting];    // error    NSError *error=nil;    _audioRecorder = [[AVAudioRecorder alloc]initWithURL:url settings:setting error:&error];    _audioRecorder.delegate = self;    _audioRecorder.meteringEnabled = YES;// 監控聲波    if (error) {      NSLog(@"創建錄音機對象時發生錯誤,錯誤信息:%@",error.localizedDescription);      return nil;    }  }  return _audioRecorder;}// audioPlayer懶加載getter方法- (AVAudioPlayer *)audioPlayer {  _audioRecorder = NULL; // 每次都創建新的播放器,刪除舊的  // 資源路徑  NSURL *url = [NSURL fileURLWithPath:_filepathCaf];  // 初始化播放器,注意這里的Url參數只能為本地文件路徑,不支持HTTP Url  NSError *error = nil;  _audioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:&error];  //設置播放器屬性  _audioPlayer.numberOfLoops = 0;// 不循環  _audioPlayer.delegate = self;  _audioPlayer.volume = 0.5; // 音量  [_audioPlayer prepareToPlay];// 加載音頻文件到緩存【這個函數在調用play函數時會自動調用】  if(error){    NSLog(@"初始化播放器過程發生錯誤,錯誤信息:%@",error.localizedDescription);    return nil;  }  return _audioPlayer;}// 計時器get方法- (NSTimer *)timer {  if (!_timer) {    _timer = [NSTimer scheduledTimerWithTimeInterval:0.1f repeats:YES block:^(NSTimer * _Nonnull timer) {      if(_audioRecorder) {        // 1.更新錄音時間,單位秒        int curInterval = [_audioRecorder currentTime];        _recordTime.text = [NSString stringWithFormat:@"%02d:%02d",curInterval/60,curInterval%60];        // 2.聲波顯示        //更新聲波值        [self.audioRecorder updateMeters];        //第一個通道的音頻,音頻強度范圍:[-160~0],這里調整到0~160        float power = [self.audioRecorder averagePowerForChannel:0] + 160;        [_processView setProgress:power/160.0];      }    }];  }  return _timer;}// 錄音設置-(NSDictionary *)getAudioSetting{  // LinearPCM 是iOS的一種無損編碼格式,但是體積較為龐大  // 錄音設置信息字典  NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc] init];  // 錄音格式  [recordSettings setValue :@(kAudioFormatLinearPCM) forKey: AVFormatIDKey];  // 采樣率  [recordSettings setValue :@11025.0 forKey: AVSampleRateKey];  // 通道數(雙通道)  [recordSettings setValue :@2 forKey: AVNumberOfChannelsKey];  // 每個采樣點位數(有8、16、24、32)  [recordSettings setValue :@16 forKey: AVLinearPCMBitDepthKey];  // 采用浮點采樣  [recordSettings setValue:@YES forKey:AVLinearPCMIsFloatKey];  // 音頻質量  [recordSettings setValue:@(AVAudioQualityMedium) forKey:AVEncoderAudioQualityKey];  // 其他可選的設置  // ... ...  return recordSettings;}// 刪除filepathCaf路徑下的音頻文件-(void)deleteRecord{  NSFileManager* fileManager=[NSFileManager defaultManager];  if ([[NSFileManager defaultManager] fileExistsAtPath:self.filepathCaf]) {    // 文件已經存在    if ([fileManager removeItemAtPath:self.filepathCaf error:nil]) {      NSLog(@"刪除成功");    }else {      NSLog(@"刪除失敗");    }  }else {    return; // 文件不存在無需刪除  }}#pragma mark -錄音流程控制函數// 開始錄音或者繼續錄音- (IBAction)startOrResumeRecord {  // 注意調用audiorecorder的get方法  if (![self.audioRecorder isRecording]) {    // 如果該路徑下的音頻文件錄制過則刪除    [self deleteRecord];    // 開始錄音,會取得用戶使用麥克風的同意    [_audioRecorder record];  }}// 錄音暫停- (IBAction)pauseRecord {  if (_audioRecorder) {    [_audioRecorder pause];  }}// 結束錄音- (IBAction)stopRecord {  [_audioRecorder stop];}#pragma mark -錄音播放// 播放錄制好的音頻- (IBAction)playRecordedAudio {  // 沒有文件不播放  if (![[NSFileManager defaultManager] fileExistsAtPath:self.filepathCaf]) return;  // 播放最新的錄音  [self.audioPlayer play];}@end

Demo下載:demo

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品美乳一区二区免费| 国产69精品久久久久9| 成人在线精品视频| 国产精品午夜视频| 91av在线网站| 国产suv精品一区二区| 欧美一区二区三区免费视| 成人免费高清完整版在线观看| 国产精品久久一区| 亚洲视频在线观看免费| 成人国产精品av| 97久久精品人搡人人玩| 91九色在线视频| 91精品啪在线观看麻豆免费| 在线视频欧美性高潮| 亚洲精品中文字幕有码专区| 国产精品丝袜久久久久久不卡| 菠萝蜜影院一区二区免费| 一区二区在线免费视频| 日韩中文字幕第一页| 日韩欧美视频一区二区三区| 色老头一区二区三区在线观看| 欧美亚州一区二区三区| 国产成+人+综合+亚洲欧美丁香花| 久久视频在线免费观看| 97精品国产aⅴ7777| 尤物tv国产一区| 久久精品国产91精品亚洲| 亚洲第一页中文字幕| 国产精品一区二区女厕厕| 国产精品第3页| 国产一区二区三区日韩欧美| 久久久精品在线| 久久精品视频va| 亚洲欧洲日产国码av系列天堂| 日韩av影院在线观看| 亚洲mm色国产网站| 亚洲品质视频自拍网| 欧美激情aaaa| 91在线视频一区| 国产精品久久久久久久久久久不卡| 亚洲最大的网站| 国产欧美日韩专区发布| 精品视频在线导航| 欧美大片在线免费观看| 欧美放荡办公室videos4k| 久久艹在线视频| 精品久久久久久中文字幕| 日韩精品免费观看| 成人免费大片黄在线播放| 久久99亚洲热视| 久久色免费在线视频| 日本午夜精品理论片a级appf发布| 亚洲一区二区三区乱码aⅴ蜜桃女| 富二代精品短视频| 中文字幕在线日韩| 欧美国产中文字幕| 日本一区二区不卡| 日韩在线观看高清| 国产成人jvid在线播放| 国产一区在线播放| 日韩电影视频免费| 7777精品久久久久久| 国产精品视频1区| 欧美电影免费观看高清| 国产欧美日韩高清| 日韩男女性生活视频| 日韩电影网在线| 亚洲性69xxxbbb| 日韩免费观看在线观看| 最近2019中文免费高清视频观看www99| 欧美韩国理论所午夜片917电影| 日韩国产中文字幕| 亚洲乱码国产乱码精品精天堂| 国模吧一区二区三区| 欧美成人免费在线视频| 欧美日韩成人黄色| 庆余年2免费日韩剧观看大牛| 国内精品久久久久久| 91精品久久久久久久久久久| 91久久精品美女| 国产999精品久久久影片官网| 亚洲已满18点击进入在线看片| 日韩在线观看你懂的| 欧美激情视频播放| 国内精品久久久久| 久久久精品2019中文字幕神马| 91美女高潮出水| 欧美视频在线观看免费网址| 性亚洲最疯狂xxxx高清| 亚洲国产精久久久久久久| 国产亚洲一级高清| 6080yy精品一区二区三区| 91最新在线免费观看| 91精品视频一区| 97国产真实伦对白精彩视频8| 日韩在线欧美在线国产在线| 欧美成人激情在线| 亚洲精品久久久一区二区三区| 中文字幕日韩欧美| 亚洲人成电影网站色www| 欧美日韩亚洲91| 欧洲成人免费视频| 日韩久久精品电影| 亚洲欧美在线看| 久久久国产精彩视频美女艺术照福利| 国产一区二区三区在线观看网站| 日韩欧美精品网址| yellow中文字幕久久| 成人网页在线免费观看| 狠狠久久五月精品中文字幕| 国产在线精品成人一区二区三区| 欧美体内谢she精2性欧美| 精品爽片免费看久久| 91青草视频久久| 欧美激情一二三| 久久免费视频在线| 欧美人在线观看| 国产免费观看久久黄| 久久的精品视频| 欧美日韩一区二区三区在线免费观看| 国产精品偷伦视频免费观看国产| 成人情趣片在线观看免费| 欧美精品在线播放| 欧美精品九九久久| 精品女同一区二区三区在线播放| 欧美在线一级视频| 一道本无吗dⅴd在线播放一区| 亚洲中国色老太| 欧美巨大黑人极品精男| 国产精品成人av在线| 成人免费xxxxx在线观看| 国产999精品久久久影片官网| 欧美性极品xxxx做受| 欧美激情视频网址| 国外成人在线播放| 欧美中文字幕在线视频| 国产91免费看片| 一区二区三区天堂av| 亚洲精品第一国产综合精品| 精品magnet| 日韩中文字幕免费视频| 久久国产精品99国产精| 成人激情免费在线| 国产欧美一区二区三区久久人妖| 97人人爽人人喊人人模波多| 国模极品一区二区三区| 国产精品劲爆视频| 81精品国产乱码久久久久久| 日韩精品在线第一页| 国产精品成人国产乱一区| 91国内免费在线视频| 亚洲第一免费播放区| 久久免费视频观看| www.日韩视频| 久久久精品网站| 欧美一级在线亚洲天堂| 日本中文字幕久久看| 久久91亚洲精品中文字幕| 亚洲精品自拍视频| 国产精品99一区| 亚洲精品日产aⅴ| 91九色视频在线| 538国产精品一区二区在线|