如何在iphone中录制语音和播放

如何在iphone中录制语音和播放,iphone,Iphone,我已经在我们的项目中实现了录音功能,但我无法控制停止和放弃按钮。在第二次单击“放弃”按钮后,无法录制语音。 单击“放弃”后,音频文件也将播放,无法再次单击“开始”按钮 请帮我做这个 这是源代码 .h file @interface VoiceInput : UIViewController <AVAudioRecorderDelegate> { //Audio record float remainingDel

我已经在我们的项目中实现了录音功能,但我无法控制停止和放弃按钮。在第二次单击“放弃”按钮后,无法录制语音。 单击“放弃”后,音频文件也将播放,无法再次单击“开始”按钮

请帮我做这个

这是源代码

.h file

@interface VoiceInput : UIViewController
                                 <AVAudioRecorderDelegate>
{
//Audio record

  float remainingDelayTime;
  float remainingRecordTime;
  UILabel *delayLabel;

  UIProgressView *progressView;
  AVAudioRecorder *recorder;
  NSTimer *delayTimer;
  NSTimer *recordTimer;
  BOOL toggle;
  NSURL *recordedTmpFile;
  NSError *error;
}
@property (nonatomic, retain) AVAudioRecorder *recorder;
@property (nonatomic, retain) NSTimer *delayTimer;
@property (nonatomic, retain) NSTimer *recordTimer;
@end

.m file

@implementation VoiceInput
@synthesize progressView;
@synthesize recorder;
@synthesize delayTimer;
@synthesize recordTimer;

- (void)viewDidLoad
{
    toggle = YES;
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
    [audioSession setActive:YES error:&error];
}

-(void)startPushed
{
   if (toggle)
    {
        remainingDelayTime = 4.0;
        delayTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                                      target:self
                                                    selector:@selector(delayTimerFired:)
                                                    userInfo:nil
                                                     repeats:YES];
        toggle = NO;
        NSMutableDictionary *rs = [[NSMutableDictionary alloc] init];
        [rs setValue:[NSNumber numberWithInt:kAudioFormatAppleIMA4] forKey:AVFormatIDKey];
        [rs setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
        [rs setValue:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey];
        recordedTmpFile = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"%.0f.%@", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"caf"]]];
        NSLog(@"USING FILE CALLED: %@", recordedTmpFile);

        recorder = [[AVAudioRecorder alloc] initWithURL:recordedTmpFile settings:rs error:&error];
        [recorder setDelegate:self];
        [recorder prepareToRecord];
        [recorder record];

    }
    else
    {
        toggle = YES;
        NSLog(@"Using File Called: %@", recordedTmpFile);
        [recorder stop];
    }


  self.discardButton.enabled = NO;
  self.startButton.enabled = NO;
  self.stopButton.enabled = YES;

}

-(void)stopPushed
{
if([self.recorder isRecording])
  {
    [self.recorder stop];

    if(remainingRecordTime >= 1.0)
    {
      [self.recordTimer invalidate];
    }
}
self.delayLabel.textColor = [UIColor darkGrayColor];
 self.delayLabel.text = [[NSString alloc] initWithFormat:@"Record in ..."];

  self.discardButton.enabled = YES;
  self.playbackButton.enabled = YES;
  self.startButton.enabled = NO;
  self.stopButton.enabled = NO;

}

-(void)playbackPushed
{ 
  AVAudioPlayer *avPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:recordedTmpFile    error:&error];
    [avPlayer prepareToPlay];
    [avPlayer play];

  self.discardButton.enabled = YES;
  self.playbackButton.enabled = YES;
  self.returnButton.enabled = YES;
  self.startButton.enabled = YES;
  self.stopButton.enabled = YES;

}

-(void)discardPushed
{
  [self.recorder deleteRecording];
  self.progressView.progress = 0;
  self.delayLabel.textColor = [UIColor darkGrayColor];
  self.delayLabel.text = @"Record in ...";

  self.discardButton.enabled = NO;
  self.playbackButton.enabled = NO;
  self.startButton.enabled = YES;
  self.stopButton.enabled = YES;

}

-(void)delayTimerFired:(NSTimer *)theDelayTimer
{
  self.progressView.progress = 0;
  remainingDelayTime -= 1.0;
  NSLog(@"fired %f", remainingDelayTime);
  self.delayLabel.textColor = [UIColor blackColor];
  self.delayLabel.text = [[NSString alloc] initWithFormat:@"Record in %2.0f",
                            remainingDelayTime];

  if(remainingDelayTime <= 0.0)
  {
    [self.delayTimer invalidate];
    self.delayLabel.text = [[NSString alloc] initWithFormat:@"Recording"];

    [self.recorder recordForDuration:TIME];
    remainingRecordTime = TIME;
    recordTimer = [NSTimer scheduledTimerWithTimeInterval:TIME_DECREMENT
                                             target:self
                                           selector:@selector(recordTimerFired:)
                                           userInfo:nil
                                            repeats:YES];
  }

}

-(void)recordTimerFired:(NSTimer *)theRecordTimer
{
  remainingRecordTime -= TIME_DECREMENT;
  NSLog(@"fired %f", remainingRecordTime);
  self.progressView.progress = (TIME - remainingRecordTime)/TIME;

  if(remainingRecordTime <= 0.0)
  {
    [self.recordTimer invalidate];
  }

}
.h文件
@接口语音输入:UIViewController
{
//录音
浮动剩余延迟时间;
浮动剩余记录时间;
UILabel*延迟标签;
UIProgressView*progressView;
AVAudioRecorder*录音机;
n定时器*延迟定时器;
NSTimer*记录计时器;
布尔开关;
NSURL*RecordedTMP文件;
n错误*错误;
}
@属性(非原子,保留)AVAudioRecorder*记录器;
@属性(非原子,保留)NSTimer*delayTimer;
@属性(非原子,保留)NSTimer*recordTimer;
@结束
.m文件
@语音输入的实现
@综合进步观;
@综合记录器;
@综合延时定时器;
@综合记录定时器;
-(无效)viewDidLoad
{
切换=是;
AVAudioSession*audioSession=[AVAudioSession sharedInstance];
[audioSession setCategory:AvaudioSessionCategory播放和记录错误:&错误];
[audioSession setActive:是错误:&错误];
}
-(无效)启动推送
{
如果(切换)
{
剩余延迟时间=4.0;
delayTimer=[NSTimer scheduledTimerWithTimeInterval:1.0
目标:自我
选择器:@selector(delayTimerFired:)
用户信息:无
重复:是];
切换=否;
NSMutableDictionary*rs=[[NSMutableDictionary alloc]init];
[rs setValue:[NSNumber NUMBERWINT:kAudioFormatAppleIMA4]forKey:AVFormatIDKey];
[rs setValue:[NSNumber numberWithFloat:44100.0]forKey:AVSampleRateKey];
[rs setValue:[NSNumber numberWithInt:2]forKey:AVNumberOfChannelsKey];
RecordedTempFile=[NSURL fileURLWithPath:[NSTemporaryDirectory()stringByAppendingPathComponent:[NSString stringWithFormat:@“%.0f.%@,[NSDate TimeIntervalenceReferenceDate]*1000.0,@“caf”]];
NSLog(@“正在使用名为:%@”的文件,recordedTmpFile);
recorder=[[AVAudioRecorder alloc]initWithURL:RecordedTempFile设置:rs错误:&错误];
[记录器设置代表:自我];
[记录者准备记录];
[录音记录];
}
其他的
{
切换=是;
NSLog(@“正在使用名为:%@”的文件,recordedTmpFile);
[录音机停止];
}
self.discardButton.enabled=否;
self.startButton.enabled=否;
self.stopButton.enabled=是;
}
-(无效)停止
{
如果([self.recorder isRecording])
{
[自记停止];
如果(剩余记录时间>=1.0)
{
[self.recordTimer invalidate];
}
}
self.delayLabel.textColor=[UIColor darkGrayColor];
self.delayLabel.text=[[NSString alloc]initWithFormat:@“记录在…”);
self.discardButton.enabled=是;
self.playbackButton.enabled=是;
self.startButton.enabled=否;
self.stopButton.enabled=否;
}
-(无效)已推后播放
{ 
AVAudioPlayer*avPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:RecordedTempFile错误:&错误];
[avPlayer prepareToPlay];
[avPlayer play];
self.discardButton.enabled=是;
self.playbackButton.enabled=是;
self.returnButton.enabled=是;
self.startButton.enabled=是;
self.stopButton.enabled=是;
}
-(作废)作废
{
[自记删除记录];
self.progressView.progress=0;
self.delayLabel.textColor=[UIColor darkGrayColor];
self.delayLabel.text=@“记录在…”;
self.discardButton.enabled=否;
self.playbackButton.enabled=否;
self.startButton.enabled=是;
self.stopButton.enabled=是;
}
-(void)DelayTimer已启用:(n计时器*)延迟器
{
self.progressView.progress=0;
剩余延迟时间-=1.0;
NSLog(@“已激发%f”,剩余延迟时间);
self.delayLabel.textColor=[UIColor blackColor];
self.delayLabel.text=[[NSString alloc]initWithFormat:@“记录在%2.0f中”,
剩余延迟时间];

如果(remainingDelayTime查看此项。您可以通过以下方式开始录制:-

- (void) startRecording
{
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    NSError *err = nil;
    [audioSession setCategory :AVAudioSessionCategoryPlayAndRecord error:&err];
    [audioSession setMode:AVAudioSessionModeVoiceChat error:&err];

    if(err)
    {
        NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
        return;
    }

    [audioSession setActive:YES error:&err];
    err = nil;

    if(err)
    {
        NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
        return;
    }

    recordSetting = [[NSMutableDictionary alloc] init];

    // We can use kAudioFormatAppleIMA4 (4:1 compression) or kAudioFormatLinearPCM for nocompression
    [recordSetting setValue :[NSNumber numberWithInt:kAudioFormatAppleIMA4] forKey:AVFormatIDKey];

    // We can use 44100, 32000, 24000, 16000 or 12000 depending on sound quality
    [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];

    // We can use 2(if using additional h/w) or 1 (iPhone only has one microphone)
    [recordSetting setValue:[NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey];

    [recordSetting setObject:[NSNumber numberWithInt:12800] forKey:AVEncoderBitRateKey];
    [recordSetting setObject:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
    [recordSetting setObject:[NSNumber numberWithInt: AVAudioQualityMax] forKey: AVEncoderAudioQualityKey];  

    NSString *str;
    str = [NSString stringWithFormat:@"%@/MySound.caf",DOCUMENTS_FOLDER];


    NSLog(@"recorderFilePath: %@",str);

    NSURL *url = [NSURL fileURLWithPath:str];

    err = nil;
    recorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:&err];
    if(!recorder)
    {
        NSLog(@"recorder: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
        UIAlertView *alert =
        [[UIAlertView alloc] initWithTitle: @"Warning"
                                   message: [err localizedDescription]
                                  delegate: nil
                         cancelButtonTitle:@"OK"
                         otherButtonTitles:nil];
        [alert show];

        return;
    }

    //prepare to record
    [recorder setDelegate:self];
    [recorder prepareToRecord];
    recorder.meteringEnabled = YES;

    BOOL audioHWAvailable = audioSession.inputIsAvailable;
    if (! audioHWAvailable) {
        UIAlertView *cantRecordAlert =
        [[UIAlertView alloc] initWithTitle: @"Warning"
                                   message: @"Audio input hardware not available"
                                  delegate: nil
                         cancelButtonTitle:@"OK"
                         otherButtonTitles:nil];
        [cantRecordAlert show];

        return;
    }

    // start recording
    [recorder recordForDuration:(NSTimeInterval) 20];
    }
- (void)playRecordingSound
{
if(!recorderFilePath)
    recorderFilePath = [NSString stringWithFormat:@"%@/MySound.caf", DOCUMENTS_FOLDER] ;
    if(soundID)
{
    AudioServicesDisposeSystemSoundID(soundID);
}

//Get a URL for the sound file
NSURL *filePath = [NSURL fileURLWithPath:recorderFilePath isDirectory:NO];

//Use audio sevices to create the sound
AudioServicesCreateSystemSoundID((__bridge CFURLRef)filePath, &soundID);

//Use audio services to play the sound
AudioServicesPlaySystemSound(soundID);
这将开始录制。录制完成后,您可以停止录制:-

- (void) stopRecording
{
[recorder stop];
}
现在,您可以通过以下方式播放您的录音:-

- (void) startRecording
{
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    NSError *err = nil;
    [audioSession setCategory :AVAudioSessionCategoryPlayAndRecord error:&err];
    [audioSession setMode:AVAudioSessionModeVoiceChat error:&err];

    if(err)
    {
        NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
        return;
    }

    [audioSession setActive:YES error:&err];
    err = nil;

    if(err)
    {
        NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
        return;
    }

    recordSetting = [[NSMutableDictionary alloc] init];

    // We can use kAudioFormatAppleIMA4 (4:1 compression) or kAudioFormatLinearPCM for nocompression
    [recordSetting setValue :[NSNumber numberWithInt:kAudioFormatAppleIMA4] forKey:AVFormatIDKey];

    // We can use 44100, 32000, 24000, 16000 or 12000 depending on sound quality
    [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];

    // We can use 2(if using additional h/w) or 1 (iPhone only has one microphone)
    [recordSetting setValue:[NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey];

    [recordSetting setObject:[NSNumber numberWithInt:12800] forKey:AVEncoderBitRateKey];
    [recordSetting setObject:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
    [recordSetting setObject:[NSNumber numberWithInt: AVAudioQualityMax] forKey: AVEncoderAudioQualityKey];  

    NSString *str;
    str = [NSString stringWithFormat:@"%@/MySound.caf",DOCUMENTS_FOLDER];


    NSLog(@"recorderFilePath: %@",str);

    NSURL *url = [NSURL fileURLWithPath:str];

    err = nil;
    recorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:&err];
    if(!recorder)
    {
        NSLog(@"recorder: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
        UIAlertView *alert =
        [[UIAlertView alloc] initWithTitle: @"Warning"
                                   message: [err localizedDescription]
                                  delegate: nil
                         cancelButtonTitle:@"OK"
                         otherButtonTitles:nil];
        [alert show];

        return;
    }

    //prepare to record
    [recorder setDelegate:self];
    [recorder prepareToRecord];
    recorder.meteringEnabled = YES;

    BOOL audioHWAvailable = audioSession.inputIsAvailable;
    if (! audioHWAvailable) {
        UIAlertView *cantRecordAlert =
        [[UIAlertView alloc] initWithTitle: @"Warning"
                                   message: @"Audio input hardware not available"
                                  delegate: nil
                         cancelButtonTitle:@"OK"
                         otherButtonTitles:nil];
        [cantRecordAlert show];

        return;
    }

    // start recording
    [recorder recordForDuration:(NSTimeInterval) 20];
    }
- (void)playRecordingSound
{
if(!recorderFilePath)
    recorderFilePath = [NSString stringWithFormat:@"%@/MySound.caf", DOCUMENTS_FOLDER] ;
    if(soundID)
{
    AudioServicesDisposeSystemSoundID(soundID);
}

//Get a URL for the sound file
NSURL *filePath = [NSURL fileURLWithPath:recorderFilePath isDirectory:NO];

//Use audio sevices to create the sound
AudioServicesCreateSystemSoundID((__bridge CFURLRef)filePath, &soundID);

//Use audio services to play the sound
AudioServicesPlaySystemSound(soundID);
}

希望有帮助,谢谢:)