#import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN typedef void (^AudioUtilsCallbackBlock)(id responseData); typedef void (^BackBlock)(BOOL isCanRecord); @interface WYGreetingCardRecording : NSObject /** 开始录音 */ - (void)startStreamRecord:(AudioUtilsCallbackBlock)block; /** 结束录音 */ - (void)stopStreamRecord:(AudioUtilsCallbackBlock)block; @end NS_ASSUME_NONNULL_END .M文件 #import "WYGreetingCardRecording.h" #import <AVFoundation/AVFoundation.h> #import "lame.h" //把lame库导入到文件内 @interface WYGreetingCardRecording()<AVAudioRecorderDelegate,AVAudioPlayerDelegate> { AVAudioPlayer * player;// 音频播放 NSURL *recordUrl; NSURL *mp3FilePath; AVAudioRecorder *audioRecorder; AVAudioSession *audioSession; NSString *base64Str; } @property(nonatomic,copy)AudioUtilsCallbackBlock block; @end @implementation WYGreetingCardRecording //开始录音 - (void)startRecord { //开始录音 //录音设置 NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init]; //设置录音格式 AVFormatIDKey==kAudioFormatLinearPCM [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey]; //设置录音采样率(Hz) 如:AVSampleRateKey==8000/44100/96000(影响音频的质量), 采样率必须要设为11025才能使转化 成mp3格式后不会失真 [recordSetting setValue:[NSNumber numberWithFloat:11025.0] forKey:AVSampleRateKey]; //录音通道数 1 或 2 ,要转换成mp3格式必须为双通道 [recordSetting setValue:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey]; //线性采样位数 8、16、24、32 [recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; //录音的质量 [recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityHigh] forKey:AVEncoderAudioQualityKey]; //存储录音文件 recordUrl = [NSURL URLWithString:[NSTemporaryDirectory() stringByAppendingString:@"selfRecord.wav"]]; //初始化 audioRecorder = [[AVAudioRecorder alloc] initWithURL:recordUrl settings:recordSetting error:nil]; //开启音量检测 audioRecorder.meteringEnabled = YES; audioSession = [AVAudioSession sharedInstance];//得到AVAudioSession单例对象 if (![audioRecorder isRecording]) { [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];//设置类别,表示该应用同时支持播放和录音 [audioSession setActive:YES error:nil];//启动音频会话管理,此时会阻断后台音乐的播放. [audioRecorder prepareToRecord]; [audioRecorder peakPowerForChannel:0.0]; [audioRecorder record]; self.block(@{@"code":@"1",@"msg":@"开始录音"}); } } //录音停止 - (void)endRecord { [audioRecorder stop]; //录音停止 [audioSession setActive:NO error:nil]; //一定要在录音停止以后再关闭音频会话管理(否则会报错),此时会延续后台音乐播 放 } //转成MP3文件 - (void)transformCAFToMP3 { mp3FilePath = [NSURL URLWithString:[NSTemporaryDirectory() stringByAppendingString:@"myselfRecord.mp3"]]; @try { int read, write; FILE *pcm = fopen([[recordUrl absoluteString] cStringUsingEncoding:1], "rb"); //source 被转换的音频文件位置 fseek(pcm, 4*1024, SEEK_CUR); //skip file header if (pcm) { FILE *mp3 = fopen([[mp3FilePath absoluteString] cStringUsingEncoding:1], "wb"); //output 输出生成的Mp3文件位置 const int PCM_SIZE = 8192; const int MP3_SIZE = 8192; short int pcm_buffer[PCM_SIZE*2]; unsigned char mp3_buffer[MP3_SIZE]; lame_t lame = lame_init(); lame_set_in_samplerate(lame, 11025.0); lame_set_VBR(lame, vbr_default); lame_init_params(lame); do { read = (int)fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm); if (read == 0) write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE); else write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE); fwrite(mp3_buffer, write, 1, mp3); } while (read != 0); lame_close(lame); fclose(mp3); fclose(pcm); } }@catch (NSException *exception) { NSLog(@"%@",[exception description]); }@finally { NSLog(@"MP3生成成功"); base64Str = [self mp3ToBASE64]; NSDictionary *theMessage = [NSDictionary dictionaryWithObjectsAndKeys:@"1",@"code",nullSafe(base64Str),@"base64", nil]; // NSString *jsonStr = [theMessage mj_JSONString]; if (self.block) { self.block(theMessage); } if(base64Str.length > ) { [self deleRecordingFile]; } } } //MP3转BASE64 - (NSString *)mp3ToBASE64{ NSData *mp3Data = [NSData dataWithContentsOfFile:[NSTemporaryDirectory() stringByAppendingString:@"myselfRecord.mp3"]]; NSString *_encodedImageStr = [mp3Data base64EncodedStringWithOptions:0]; NSLog(@"===Encoded image:\n%@", _encodedImageStr); return _encodedImageStr; } //开始录音 - (void)startStreamRecord:(AudioUtilsCallbackBlock)block { self.block = block; //判断权限 [self checkPermission:^(BOOL isCan) { if (isCan) { [self startRecord]; } else { self.block(@{@"code":@"0",@"msg":@"麦克风权限未开启"}); // [InstanceTool permissionToRemindWithRemindTitle:@"请在iphone的“设置-隐私-麦克风”选项中,允许访问你的麦克风" remindType:IAPermissionToRemindTypeAudio]; } }]; } //结束录音 - (void)stopStreamRecord:(AudioUtilsCallbackBlock)block { self.block = block; [self endRecord]; [self transformCAFToMP3]; } //麦克风权限请求: - (BOOL)checkPermission:(BackBlock)block{ __block BOOL bCanRecord = YES; if ([[[UIDevice currentDevice]systemVersion]floatValue] >= 7.0) { AVAuthorizationStatus videoAuthStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio]; if (videoAuthStatus == AVAuthorizationStatusNotDetermined) {// 未询问用户是否授权 AVAudioSession *audioSession = [AVAudioSession sharedInstance]; if ([audioSession respondsToSelector:@selector(requestRecordPermission:)]) { [audioSession performSelector:@selector(requestRecordPermission:) withObject:^(BOOL granted) { if (granted) { bCanRecord = YES; } else { bCanRecord = NO; } block(bCanRecord); }]; } } else if(videoAuthStatus == AVAuthorizationStatusRestricted || videoAuthStatus == AVAuthorizationStatusDenied) { NSLog(@"未授权"); block(NO); } else{ block(YES); } } return bCanRecord; } - (void)deleRecordingFile { //删除上次生成的文件,保留最新文件 NSFileManager *fileManager = [NSFileManager defaultManager]; if ([NSTemporaryDirectory() stringByAppendingString:@"myselfRecord.mp3"]) { [fileManager removeItemAtPath:[NSTemporaryDirectory() stringByAppendingString:@"myselfRecord.mp3"] error:nil]; } if ([NSTemporaryDirectory() stringByAppendingString:@"selfRecord.wav"]) { [fileManager removeItemAtPath:[NSTemporaryDirectory() stringByAppendingString:@"selfRecord.wav"] error:nil]; } } @end 帖子的录入文字太长了,下一篇专门讲解代码里的宏和引入的文件怎么生成
相关推荐
后续更新成base64数据保存到数据库,直接base64转换成图片保存在服务器,数据库存储相关信息,下载或者查看的时候直接调用相对路径的文件即可。 毕竟base64的数据保存到数据库太影响查询了。另外在存储文件的时候...
这种转换在很多场景下非常有用,比如在前端开发中,当需要在网页上直接显示图片而服务器又不支持二进制文件上传时,可以将图片转为Base64格式内嵌在HTML中。此外,在iOS应用开发中,也常用于将图片数据存储到数据库...
在iOS开发中,图片的BASE64编码与解码是一种常见的数据处理技术,它涉及到字符串与二进制数据之间的转换。BASE64是一种用于将任意二进制数据转化为ASCII字符编码的方法,通常用于在网络上传输非ASCII字符或者作为...
在iOS开发中,音频处理是一项常见的任务,尤其是涉及到音频格式转换时。本篇文章将深入探讨如何在iOS中将PCM(脉冲编码调制)音频数据转换为MP3格式。PCM是一种未经压缩的原始数字音频格式,而MP3则是广泛使用的有损...
在iOS开发中,GTMBase64是一种常用的Base64编码和解码工具,它是由Google提供的开源库,便于在Objective-C项目中处理Base64相关的任务。Base64是一种用于将二进制数据转换为可打印ASCII字符的编码方式,广泛应用于...
在iOS设备中进行录音,录音文件的格式为wav。但这种格式文件会很大,上传到服务器会消耗大量流量。为了适应终端的播放功能以及文件大小的要求,特将wav转换为mp3格式文件来使用。
在iOS开发中,有时我们需要将图片数据转换成Base64编码,以便于在网络上传输或者存储在数据库中。Base64是一种用64个字符来表示任意二进制数据的方法,通常用于在邮件系统或者HTTP协议中传输非ASCII字符。在这个...
本示例将探讨iOS系统自带的加密算法——DES(Data Encryption Standard)以及BASE64编码技术,这两种技术在iOS应用开发中都有广泛应用。 首先,我们来了解**BASE64编码**。BASE64是一种常见的字符编码方式,主要...
ios录音的caf文件转MP3文件,以兼容android 注意音频参数的设置,如果声音异常,请调整参数。 code: AVAudioSession *session = [AVAudioSession sharedInstance]; NSError *sessionError; [session ...
在iOS中,我们可以使用内置的AVFoundation框架来实现录音功能,并通过第三方库如LAME MP3 Encoder来将录音文件转换为MP3格式。下面我们将详细探讨这个过程。 首先,让我们从录音部分开始。在iOS上,AVFoundation...
Base64编码将每3个字节的二进制数据转换为4个字符的Base64字符串,这样可以在大部分文本格式中安全地传输。在实际应用中,Base64常用于在HTTP头部传输二进制数据,或者在电子邮件系统中编码附件。 在Android、iOS和...
iOS 录音转码MP3及转码BASE64上传 一,开始录音 NSLog(@开始录音); [self startRecord]; - (void)startRecord { //删除上次生成的文件,保留最新文件 NSFileManager *fileManager = [NSFileManager ...
Base64编码是一种将任意二进制数据转换为ASCII字符集的表示方法,它将3个字节的数据转换成4个可打印的ASCII字符。这样转换后的字符串可以在邮件、HTML或XML等文本格式中无损地传输二进制数据。 在C++中实现这个功能...
AMR录音格式转换主要是为了让iOS设备上的录音文件能在不同平台(如Android、Web等)上无缝使用,因为这些平台通常都能很好地支持AMR格式。 一、AMR格式介绍 AMR是3GPP制定的一种音频编码标准,主要应用于语音通信,...
本话题将详细介绍如何在iOS应用中实现录音,并将录制的CAF格式音频文件转换为更常见的MP3格式。 首先,我们要开启录音功能。在iOS中,你需要在Info.plist文件中添加`NSMicrophoneUsageDescription`键,以请求用户的...
// 基于filePath,将文件转换为Base64编码,并在转换成功后执行回调函数 console.log('转换后的Base64字符串:', base64String); // 这里你可以将base64String发送到服务器进行存储或处理 }); }, fail: ...
在Objective-C中,虽然iOS SDK提供了内置的`NSData+Base64`类别,但如果你在项目中使用了自定义的`base64.h`和`base64.m`文件,可能是因为需要兼容较旧的iOS版本,或者为了实现特定的性能优化,或者是为了避免依赖...
在iOS和OSX平台上,开发人员经常使用Base64来处理加密和解密操作,特别是在网络通信、存储敏感信息或者在不同格式之间转换数据时。 Base64的基本原理是将每3个字节的数据(24位)转化为4个6位的字符(总计26^6=64个...
例如,可以先用AES对数据进行加密,然后使用Base64编码将加密后的结果转化为可打印的字符串,便于在网络上传输。而MD5则常用于生成数据的指纹,以检测数据是否被篡改。 在iOS中实现这些加密功能,可以借助于系统的...
在iOS开发中,音频处理是一项重要的技能,尤其是涉及到音频文件的转换。本示例主要探讨的是录音功能以及AMR和WAV两种音频格式之间的转换。下面将详细介绍这两个关键知识点。 一、iOS录音功能 在iOS平台上,我们...