类似于微信发语音Demo



AVAudioSession类从AVFoundation框架中引入, 每个IOS应用都有一个音频会话, 这个会话可以被AVAudioSession的sharedInstance类方法访问.


AVAudioSessionCategoryPlayAndRecord 这个类别中允许你的应用同时进行声音的播放和录制.当你的声音播放和录制开始后, 其他应用的声音播放将会停止,主UI界面会照常工作, 这时即使屏幕被锁定或者设备为静音模式,音频的播放都会继续.


demo写的异常粗糙, 以后再重新写一个

#import "ViewController.h"

#import "UIImage+Extension.h"

#import <AVFoundation/AVFoundation.h>


#define WIDTH [[UIScreen mainScreen] bounds].size.width

#define HEIGHT [[UIScreen mainScreen] bounds].size.height


@interface ViewController ()


// 录音名字

@property (nonatomic,copyNSString *playName;


// 录音器

@property (nonatomic,strongAVAudioRecorder *recorder;


// 播放器

@property (nonatomic,strongAVAudioPlayer *player;


// 属性设置

@property (nonatomic,copyNSDictionary *recorderSettingsDict;


// 声音标识

@property (nonatomic,copyNSMutableArray *volumImages;


// 定时器

@property (nonatomic,strongNSTimer *timer;


//

@property (nonatomic,assigndouble lowPassResults;


@end


@implementation ViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    

    // 创建button

    UIButton *button = [[UIButtonallocinitWithFrame:CGRectMake(30,HEIGHT*0.6,WIDTH-6040)];

    [self.viewaddSubview:button];

    

    [button setBackgroundImage:[UIImageresizedImageWithName:@"VoiceBtn_Black"]forState:UIControlStateNormal];

    [button setBackgroundImage:[UIImageresizedImageWithName:@"VoiceBtn_BlackHL"]forState:UIControlStateHighlighted];

    

    [button setTitle:@"发送新消息"forState:UIControlStateNormal];

    [button setTitle:@"按住说话"forState:UIControlStateHighlighted];

    [button setTitleColor:[UIColordarkGrayColorforState:UIControlStateNormal];

    button.titleLabel.font = [UIFontsystemFontOfSize:14];


    [button addTarget:selfaction:@selector(holdDownButtonTouchDown)forControlEvents:UIControlEventTouchDown];

    [button addTarget:selfaction:@selector(holdDownButtonTouchUpInside)forControlEvents:UIControlEventTouchUpInside];

    [button addTarget:selfaction:@selector(holdDownDragOutside)forControlEvents:UIControlEventTouchDragExit];

    

    UIButton *buttonPlay = [[UIButtonallocinitWithFrame:CGRectMake(30,HEIGHT*0.7,WIDTH-6040)];

    [self.viewaddSubview:buttonPlay];

    buttonPlay.backgroundColor = [UIColorredColor];

    

    [buttonPlay addTarget:selfaction:@selector(buttonPlayMedia)forControlEvents:UIControlEventTouchDown];


    // 创建语音控件

    AVAudioSession *session = [AVAudioSession sharedInstance];

    NSError *sessionError;

    

    //AVAudioSessionCategoryPlayAndRecord用于录音和播放

    [session setCategory:AVAudioSessionCategoryPlayAndRecorderror:&sessionError];

    if(session == nil)

        NSLog(@"Error creating session: %@", [sessionErrordescription]);

    else

        [session setActive:YESerror:nil];

    

    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMaskYES)objectAtIndex:0];

    self.playName = [NSStringstringWithFormat:@"%@/play.aac",docDir];

    //录音设置

    self.recorderSettingsDict = [[NSDictionaryallocinitWithObjectsAndKeys:

                                   [NSNumber numberWithFloat8000.0],AVSampleRateKey,//采样率

                                   [NSNumber numberWithIntkAudioFormatLinearPCM],AVFormatIDKey,

                                   [NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,//采样位数默认 16

                                   [NSNumber numberWithInt1], AVNumberOfChannelsKey,//通道的数目

                                   //                                   [NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,//大端还是小端是内存的组织方式

                                   //                                   [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,//采样信号是整数还是浮点数

                                   //                                   [NSNumber numberWithInt: AVAudioQualityMedium],AVEncoderAudioQualityKey,//音频编码质量

                                   nil];

    //音量图片数组

    self.volumImages = [[NSMutableArrayalloc]initWithObjects:@"RecordingSignal001",@"RecordingSignal002",@"RecordingSignal003",

                   @"RecordingSignal004",@"RecordingSignal005",@"RecordingSignal006",

                   @"RecordingSignal007",@"RecordingSignal008",  nil];


    


}


- (void)holdDownButtonTouchDown {

    

    NSLog(@"holdDownButtonTouchDown");

    

    //按下录音

    if ([selfcanRecord]) {

        

        NSError *error = nil;

        //必须真机上测试,模拟器上可能会崩溃

        self.recorder = [[AVAudioRecorderallocinitWithURL:[NSURLURLWithString:self.playName]settings:self.recorderSettingsDicterror:&error];

        

        if (self.recorder) {

            self.recorder.meteringEnabled =YES;

            [self.recorder prepareToRecord];

            [self.recorder record];

            

            //启动定时器

            self.timer = [NSTimerscheduledTimerWithTimeInterval:0.1target:selfselector:@selector(levelTimer:)userInfo:nilrepeats:YES];

            

        } else

        {

            int errorCode = CFSwapInt32HostToBig ([error code]);

            NSLog(@"Error: %@ [%4.4s])" , [errorlocalizedDescription], (char*)&errorCode);

            

        }

    }

}


- (void)holdDownButtonTouchUpInside {

    

    NSLog(@"holdDownButtonTouchUpInside");

    

    //录音停止

    [self.recorderstop];

    self.recorder =nil;

    //结束定时器

    [self.timerinvalidate];

    self.timer =nil;

    //图片重置

//    self.soundLodingImageView.image = [UIImage imageNamed:[self.volumImages objectAtIndex:0]];

    

}


- (void)holdDownDragOutside {

    

    NSLog(@"holdDownDragOutside");

}


- (void)buttonPlayMedia {


    NSError *playerError;

    

    //播放

    self.player =nil;

    self.player = [[AVAudioPlayer allocinitWithContentsOfURL:[NSURLURLWithString:self.playName]error:&playerError];

    

    if (self.player ==nil)

    {

        NSLog(@"ERror creating player: %@", [playerErrordescription]);

    }else{

        [self.player play];

    }

}


-(void)levelTimer:(NSTimer*)timer_ {


    [self.recorder updateMeters];

    

    const double ALPHA =0.05;

    double peakPowerForChannel = pow(10, (0.05 * [self.recorderpeakPowerForChannel:0]));

    self.lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) *self.lowPassResults;

    

    NSLog(@"Average input: %f Peak input: %f Low pass results: %f", [self.recorderaveragePowerForChannel:0], [self.recorderpeakPowerForChannel:0],self.lowPassResults);

}


//判断是否允许使用麦克风7.0新增的方法requestRecordPermission

-(BOOL)canRecord

{

    __block BOOL bCanRecord =YES;

    if ([[[UIDevicecurrentDevicesystemVersion]compare:@"7.0"] !=NSOrderedAscending)

    {

        AVAudioSession *audioSession = [AVAudioSessionsharedInstance];

        if ([audioSession respondsToSelector:@selector(requestRecordPermission:)]) {

            [audioSession performSelector:@selector(requestRecordPermission:)withObject:^(BOOLgranted) {

                if (granted) {

                    bCanRecord = YES;

                }

                else {

                    bCanRecord = NO;

                    dispatch_async(dispatch_get_main_queue(), ^{

                        [[[UIAlertView allocinitWithTitle:nil

                                                    message:@"app需要访问您的麦克风。\n请启用麦克风-设置/隐私/麦克风"

                                                   delegate:nil

                                          cancelButtonTitle:@"关闭"

                                          otherButtonTitles:nil]show];

                    });

                }

            }];

        }

    }

    

    return bCanRecord;

}



AVAudioSession类从AVFoundation框架中引入, 每个IOS应用都有一个音频会话, 这个会话可以被AVAudioSession的sharedInstance类方法访问.


AVAudioSessionCategoryPlayAndRecord 这个类别中允许你的应用同时进行声音的播放和录制.当你的声音播放和录制开始后, 其他应用的声音播放将会停止,主UI界面会照常工作, 这时即使屏幕被锁定或者设备为静音模式,音频的播放都会继续.


demo写的异常粗糙, 以后再重新写一个

#import "ViewController.h"

#import "UIImage+Extension.h"

#import <AVFoundation/AVFoundation.h>


#define WIDTH [[UIScreen mainScreen] bounds].size.width

#define HEIGHT [[UIScreen mainScreen] bounds].size.height


@interface ViewController ()


// 录音名字

@property (nonatomic,copyNSString *playName;


// 录音器

@property (nonatomic,strongAVAudioRecorder *recorder;


// 播放器

@property (nonatomic,strongAVAudioPlayer *player;


// 属性设置

@property (nonatomic,copyNSDictionary *recorderSettingsDict;


// 声音标识

@property (nonatomic,copyNSMutableArray *volumImages;


// 定时器

@property (nonatomic,strongNSTimer *timer;


//

@property (nonatomic,assigndouble lowPassResults;


@end


@implementation ViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    

    // 创建button

    UIButton *button = [[UIButtonallocinitWithFrame:CGRectMake(30,HEIGHT*0.6,WIDTH-6040)];

    [self.viewaddSubview:button];

    

    [button setBackgroundImage:[UIImageresizedImageWithName:@"VoiceBtn_Black"]forState:UIControlStateNormal];

    [button setBackgroundImage:[UIImageresizedImageWithName:@"VoiceBtn_BlackHL"]forState:UIControlStateHighlighted];

    

    [button setTitle:@"发送新消息"forState:UIControlStateNormal];

    [button setTitle:@"按住说话"forState:UIControlStateHighlighted];

    [button setTitleColor:[UIColordarkGrayColorforState:UIControlStateNormal];

    button.titleLabel.font = [UIFontsystemFontOfSize:14];


    [button addTarget:selfaction:@selector(holdDownButtonTouchDown)forControlEvents:UIControlEventTouchDown];

    [button addTarget:selfaction:@selector(holdDownButtonTouchUpInside)forControlEvents:UIControlEventTouchUpInside];

    [button addTarget:selfaction:@selector(holdDownDragOutside)forControlEvents:UIControlEventTouchDragExit];

    

    UIButton *buttonPlay = [[UIButtonallocinitWithFrame:CGRectMake(30,HEIGHT*0.7,WIDTH-6040)];

    [self.viewaddSubview:buttonPlay];

    buttonPlay.backgroundColor = [UIColorredColor];

    

    [buttonPlay addTarget:selfaction:@selector(buttonPlayMedia)forControlEvents:UIControlEventTouchDown];


    // 创建语音控件

    AVAudioSession *session = [AVAudioSession sharedInstance];

    NSError *sessionError;

    

    //AVAudioSessionCategoryPlayAndRecord用于录音和播放

    [session setCategory:AVAudioSessionCategoryPlayAndRecorderror:&sessionError];

    if(session == nil)

        NSLog(@"Error creating session: %@", [sessionErrordescription]);

    else

        [session setActive:YESerror:nil];

    

    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMaskYES)objectAtIndex:0];

    self.playName = [NSStringstringWithFormat:@"%@/play.aac",docDir];

    //录音设置

    self.recorderSettingsDict = [[NSDictionaryallocinitWithObjectsAndKeys:

                                   [NSNumber numberWithFloat8000.0],AVSampleRateKey,//采样率

                                   [NSNumber numberWithIntkAudioFormatLinearPCM],AVFormatIDKey,

                                   [NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,//采样位数默认 16

                                   [NSNumber numberWithInt1], AVNumberOfChannelsKey,//通道的数目

                                   //                                   [NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,//大端还是小端是内存的组织方式

                                   //                                   [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,//采样信号是整数还是浮点数

                                   //                                   [NSNumber numberWithInt: AVAudioQualityMedium],AVEncoderAudioQualityKey,//音频编码质量

                                   nil];

    //音量图片数组

    self.volumImages = [[NSMutableArrayalloc]initWithObjects:@"RecordingSignal001",@"RecordingSignal002",@"RecordingSignal003",

                   @"RecordingSignal004",@"RecordingSignal005",@"RecordingSignal006",

                   @"RecordingSignal007",@"RecordingSignal008",  nil];


    


}


- (void)holdDownButtonTouchDown {

    

    NSLog(@"holdDownButtonTouchDown");

    

    //按下录音

    if ([selfcanRecord]) {

        

        NSError *error = nil;

        //必须真机上测试,模拟器上可能会崩溃

        self.recorder = [[AVAudioRecorderallocinitWithURL:[NSURLURLWithString:self.playName]settings:self.recorderSettingsDicterror:&error];

        

        if (self.recorder) {

            self.recorder.meteringEnabled =YES;

            [self.recorder prepareToRecord];

            [self.recorder record];

            

            //启动定时器

            self.timer = [NSTimerscheduledTimerWithTimeInterval:0.1target:selfselector:@selector(levelTimer:)userInfo:nilrepeats:YES];

            

        } else

        {

            int errorCode = CFSwapInt32HostToBig ([error code]);

            NSLog(@"Error: %@ [%4.4s])" , [errorlocalizedDescription], (char*)&errorCode);

            

        }

    }

}


- (void)holdDownButtonTouchUpInside {

    

    NSLog(@"holdDownButtonTouchUpInside");

    

    //录音停止

    [self.recorderstop];

    self.recorder =nil;

    //结束定时器

    [self.timerinvalidate];

    self.timer =nil;

    //图片重置

//    self.soundLodingImageView.image = [UIImage imageNamed:[self.volumImages objectAtIndex:0]];

    

}


- (void)holdDownDragOutside {

    

    NSLog(@"holdDownDragOutside");

}


- (void)buttonPlayMedia {


    NSError *playerError;

    

    //播放

    self.player =nil;

    self.player = [[AVAudioPlayer allocinitWithContentsOfURL:[NSURLURLWithString:self.playName]error:&playerError];

    

    if (self.player ==nil)

    {

        NSLog(@"ERror creating player: %@", [playerErrordescription]);

    }else{

        [self.player play];

    }

}


-(void)levelTimer:(NSTimer*)timer_ {


    [self.recorder updateMeters];

    

    const double ALPHA =0.05;

    double peakPowerForChannel = pow(10, (0.05 * [self.recorderpeakPowerForChannel:0]));

    self.lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) *self.lowPassResults;

    

    NSLog(@"Average input: %f Peak input: %f Low pass results: %f", [self.recorderaveragePowerForChannel:0], [self.recorderpeakPowerForChannel:0],self.lowPassResults);

}


//判断是否允许使用麦克风7.0新增的方法requestRecordPermission

-(BOOL)canRecord

{

    __block BOOL bCanRecord =YES;

    if ([[[UIDevicecurrentDevicesystemVersion]compare:@"7.0"] !=NSOrderedAscending)

    {

        AVAudioSession *audioSession = [AVAudioSessionsharedInstance];

        if ([audioSession respondsToSelector:@selector(requestRecordPermission:)]) {

            [audioSession performSelector:@selector(requestRecordPermission:)withObject:^(BOOLgranted) {

                if (granted) {

                    bCanRecord = YES;

                }

                else {

                    bCanRecord = NO;

                    dispatch_async(dispatch_get_main_queue(), ^{

                        [[[UIAlertView allocinitWithTitle:nil

                                                    message:@"app需要访问您的麦克风。\n请启用麦克风-设置/隐私/麦克风"

                                                   delegate:nil

                                          cancelButtonTitle:@"关闭"

                                          otherButtonTitles:nil]show];

                    });

                }

            }];

        }

    }

    

    return bCanRecord;

}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值