博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
音频录制
阅读量:6417 次
发布时间:2019-06-23

本文共 4482 字,大约阅读时间需要 14 分钟。

 

原生音视频编码  

 

基于 AVFoundation 进行音频录制

@interface ViewController ()
{ AVAudioRecorder *recorder; AVAudioPlayer *player;}@property (weak, nonatomic) IBOutlet UILabel *label; @end- (IBAction)record:(id)sender { if (recorder == nil) {// 路径拼接 NSString *filePath = [NSString stringWithFormat:@"%@/rec_audio.caf", [self documentsDirectory]];// 构建URL NSURL *fileUrl = [NSURL fileURLWithPath:filePath]; NSError *error = nil;// AVAudioSession类提供了Audio Session服务,Audio Session是指定应用于音频系统如何交互。AVAudioSession通过指定一个音频类别实现的,音频类别描述了应用使用音频的方式// 下面是设置音频回话类别// AVAudioSessionCategoryRecord代表只能输入音频,即录制音频,其效果是停止其他音频播放,开始录制音频, AVAudioSessionCategoryPlayback代表只能输出音频,即进行音频播放。 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:&error];// 设置是否“活跃”,这会把系统的任何声音关闭 [[AVAudioSession sharedInstance] setActive:YES error:&error];// 设置settings参数 NSMutableDictionary *settings = [NSMutableDictionary dictionary];// AVFormatIDKey键是设置录制音频编码格式,kAudioFormatLinearPCM代表线性PCM编码格式,PCM(pulse code modulation)线性脉冲编码调制,它是一种非压缩格式。// 注意:编码格式与文件格式不同,例如WAV是音频文件格式,它采用线性PCM音频编码 [settings setValue:[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];// AVSampleRateKey键是设置音频采样频率,44100.0是音频CD,VCD,SVCD和MP3所用的采样频率。 [settings setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];// AVNumberOfChannelsKey设置声道数量,值为1或者2 [settings setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];// AVLinearPCMBitDepthKey这是采样位数,取值为8,16,24,32,16是默认值 [settings setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];// AVLinearPCMIsBigEndianKey设置音频解码是大字节序还是小字节序,大字节序,YES,否则为NO [settings setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];// AVLinearPCMIsFloatKey设置音频解码是否为浮点数,如果是则设置为YES,否则为NO [settings setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];// 实例化recorder对象 recorder = [[AVAudioRecorder alloc] initWithURL:fileUrl settings:settings error:&error];// 设置代理 recorder.delegate = self; } // 如果正在录制,return if(recorder.isRecording) { return; }//如果正在播放,停止 if(player && player.isPlaying) { [player stop]; }// 开始录制 [recorder record]; self.label.text = @"录制中...";}- (IBAction)stop:(id)sender { self.label.text = @"停止...";// 是否正在录制 if(recorder.isRecording) { [recorder stop];//停止 recorder.delegate = nil; recorder = nil; } if(player.isPlaying) { [player stop]; }}- (IBAction)play:(id)sender { if(recorder.isRecording) { [recorder stop]; recorder.delegate = nil; recorder = nil; } if(player.isPlaying) { [player stop]; } NSString *filePath = [NSString stringWithFormat:@"%@/rec_audio.caf", [self documentsDirectory]]; NSURL *fileUrl = [NSURL fileURLWithPath:filePath]; NSError *error = nil; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error]; [[AVAudioSession sharedInstance] setActive:YES error:&error]; player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileUrl error:&error]; if(error) { NSLog(@"%@",[error description]); } else { [player play]; self.label.text = @"播放..."; } }-(NSString *)documentsDirectory{ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); return [paths objectAtIndex:0];}#pragma mark--实现AVAudioRecorderDelegate协议方法- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag{ NSLog(@"录制完成。");}- (void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)recorder error:(NSError *)error{ NSLog(@"录制错误发生: %@", [error localizedDescription]);}- (void)audioRecorderBeginInterruption:(AVAudioRecorder *)recorder{ NSLog(@"播放中断。");}- (void)audioRecorderEndInterruption:(AVAudioRecorder *)recorder withOptions:(NSUInteger)flags{ NSLog(@"中断返回。");}

 

转载于:https://www.cnblogs.com/daxueshan/p/8482656.html

你可能感兴趣的文章
线性回归与梯度下降
查看>>
【iCore3 双核心板_FPGA】实验二十:基于FIFO的ARM+FPGA数据存取实验
查看>>
java一个数分解的质因数java
查看>>
android framework-安装samba
查看>>
配置WCF的心得
查看>>
飞雪连天射白鹿笑书神侠倚碧鸳
查看>>
排名中国重读“发展Linux,中日两国之比较”有感-java教程
查看>>
VC6.0代码移植到VS2008运行时乱码问题解决
查看>>
反射实例
查看>>
Linux安装Jdk,CentOS安装Jdk
查看>>
iOS之事件穿透
查看>>
Oracle API Availability – Profile
查看>>
Chromium Embedded Framework中文文档 (如何链接不同的运行时)
查看>>
【PAT】1029. Median (25)
查看>>
web项目的getContextPath()
查看>>
SpringMvc中两个Controller类之间传递参数的方法
查看>>
.NET Core微服务之路:基于Consul最少集群实现服务的注册与发现(二)
查看>>
【WP7】转:Windows Phone 7 开发 31 日谈 目录
查看>>
6. datasource - mysql【从零开始学Spring Boot】
查看>>
编写病毒程序取款700余万,华夏银行一技术处长被捕受审
查看>>