如何在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);
}
希望有帮助,谢谢:)