`

iOS 开发将录音文件转换成MP3文件后生成base64传给后端或者回调给前端

    博客分类:
  • ios
 
阅读更多
#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


帖子的录入文字太长了,下一篇专门讲解代码里的宏和引入的文件怎么生成

 

 

分享到:
评论

相关推荐

    html5上传图片转换成base64值传入后台,再转换为图片保存在服务器

    后续更新成base64数据保存到数据库,直接base64转换成图片保存在服务器,数据库存储相关信息,下载或者查看的时候直接调用相对路径的文件即可。 毕竟base64的数据保存到数据库太影响查询了。另外在存储文件的时候...

    图片转换成base64码

    这种转换在很多场景下非常有用,比如在前端开发中,当需要在网页上直接显示图片而服务器又不支持二进制文件上传时,可以将图片转为Base64格式内嵌在HTML中。此外,在iOS应用开发中,也常用于将图片数据存储到数据库...

    IOS图片BASE64编码解码

    在iOS开发中,图片的BASE64编码与解码是一种常见的数据处理技术,它涉及到字符串与二进制数据之间的转换。BASE64是一种用于将任意二进制数据转化为ASCII字符编码的方法,通常用于在网络上传输非ASCII字符或者作为...

    iOS-音频-格式转换(pcm转成mp3)

    在iOS开发中,音频处理是一项常见的任务,尤其是涉及到音频格式转换时。本篇文章将深入探讨如何在iOS中将PCM(脉冲编码调制)音频数据转换为MP3格式。PCM是一种未经压缩的原始数字音频格式,而MP3则是广泛使用的有损...

    iOS开发 GTMBase64文件

    在iOS开发中,GTMBase64是一种常用的Base64编码和解码工具,它是由Google提供的开源库,便于在Objective-C项目中处理Base64相关的任务。Base64是一种用于将二进制数据转换为可打印ASCII字符的编码方式,广泛应用于...

    iOS 录音、格式转换

    在iOS设备中进行录音,录音文件的格式为wav。但这种格式文件会很大,上传到服务器会消耗大量流量。为了适应终端的播放功能以及文件大小的要求,特将wav转换为mp3格式文件来使用。

    ios中将base64将图片转码的demo

    在iOS开发中,有时我们需要将图片数据转换成Base64编码,以便于在网络上传输或者存储在数据库中。Base64是一种用64个字符来表示任意二进制数据的方法,通常用于在邮件系统或者HTTP协议中传输非ASCII字符。在这个...

    iOS开发:BASE64转换,内含:IOS自带DES加解密

    本示例将探讨iOS系统自带的加密算法——DES(Data Encryption Standard)以及BASE64编码技术,这两种技术在iOS应用开发中都有广泛应用。 首先,我们来了解**BASE64编码**。BASE64是一种常见的字符编码方式,主要...

    ios 录音文件caf转mp3

    ios录音的caf文件转MP3文件,以兼容android 注意音频参数的设置,如果声音异常,请调整参数。 code: AVAudioSession *session = [AVAudioSession sharedInstance]; NSError *sessionError; [session ...

    ios录音并转MP3格式

    在iOS中,我们可以使用内置的AVFoundation框架来实现录音功能,并通过第三方库如LAME MP3 Encoder来将录音文件转换为MP3格式。下面我们将详细探讨这个过程。 首先,让我们从录音部分开始。在iOS上,AVFoundation...

    android ios java后台通用DES base64加密

    Base64编码将每3个字节的二进制数据转换为4个字符的Base64字符串,这样可以在大部分文本格式中安全地传输。在实际应用中,Base64常用于在HTTP头部传输二进制数据,或者在电子邮件系统中编码附件。 在Android、iOS和...

    iOS实现录音转码MP3及转码BASE64上传示例

    iOS 录音转码MP3及转码BASE64上传 一,开始录音 NSLog(@开始录音); [self startRecord]; - (void)startRecord { //删除上次生成的文件,保留最新文件 NSFileManager *fileManager = [NSFileManager ...

    C++图片转base64字符串

    Base64编码是一种将任意二进制数据转换为ASCII字符集的表示方法,它将3个字节的数据转换成4个可打印的ASCII字符。这样转换后的字符串可以在邮件、HTML或XML等文本格式中无损地传输二进制数据。 在C++中实现这个功能...

    ios amr录音格式转换

    AMR录音格式转换主要是为了让iOS设备上的录音文件能在不同平台(如Android、Web等)上无缝使用,因为这些平台通常都能很好地支持AMR格式。 一、AMR格式介绍 AMR是3GPP制定的一种音频编码标准,主要应用于语音通信,...

    ios 录音 转MP3格式

    本话题将详细介绍如何在iOS应用中实现录音,并将录制的CAF格式音频文件转换为更常见的MP3格式。 首先,我们要开启录音功能。在iOS中,你需要在Info.plist文件中添加`NSMicrophoneUsageDescription`键,以请求用户的...

    uniapp +上传文件+安卓、ios文件选择

    // 基于filePath,将文件转换为Base64编码,并在转换成功后执行回调函数 console.log('转换后的Base64字符串:', base64String); // 这里你可以将base64String发送到服务器进行存储或处理 }); }, fail: ...

    base64文件

    在Objective-C中,虽然iOS SDK提供了内置的`NSData+Base64`类别,但如果你在项目中使用了自定义的`base64.h`和`base64.m`文件,可能是因为需要兼容较旧的iOS版本,或者为了实现特定的性能优化,或者是为了避免依赖...

    iOS&OSX; Base64加密解密

    在iOS和OSX平台上,开发人员经常使用Base64来处理加密和解密操作,特别是在网络通信、存储敏感信息或者在不同格式之间转换数据时。 Base64的基本原理是将每3个字节的数据(24位)转化为4个6位的字符(总计26^6=64个...

    iOS常用加密方法(aes、md5、base64)

    例如,可以先用AES对数据进行加密,然后使用Base64编码将加密后的结果转化为可打印的字符串,便于在网络上传输。而MD5则常用于生成数据的指纹,以检测数据是否被篡改。 在iOS中实现这些加密功能,可以借助于系统的...

    ios开发音频转换

    在iOS开发中,音频处理是一项重要的技能,尤其是涉及到音频文件的转换。本示例主要探讨的是录音功能以及AMR和WAV两种音频格式之间的转换。下面将详细介绍这两个关键知识点。 一、iOS录音功能 在iOS平台上,我们...

Global site tag (gtag.js) - Google Analytics