Почему моя запись не может быть воспроизведена? (iPhone SDK)
Я программирую приложение, которое позволяет мне записывать звуки дверного звонка и воспроизводить их на дверном звонке, который пользователь видит, когда нажимает кнопку. Мое приложение, кажется, записывает и сохраняет файл (файл находится там (в Документах) согласно симулятору iPhone, поскольку я создал каталог в делегате приложения)). Однако воспроизведение не работает. (Кстати, свойство записи возвращает TRUE.)
ОБНОВЛЕНИЕ: Вот почтовый индекс всего проекта.
Может кто-нибудь помочь мне понять, что не так?
- (void)viewDidLoad {
[super viewDidLoad];
self.view.layer.cornerRadius = 8;
[actionButton setBackgroundImage:[[UIImage imageNamed:@"biggreenbutton.png"] stretchableImageWithLeftCapWidth:10.0 topCapHeight:0.0] forState:UIControlStateNormal];
NSFileManager *nsf = [NSFileManager defaultManager];
NSArray *allDocs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [allDocs objectAtIndex:0];
NSString *savedDBells = [path stringByAppendingPathComponent:@"Custom Doorbells"];
NSString *nextFile;
for (NSInteger i = 1; i < 100; i++){
if (![nsf fileExistsAtPath:[savedDBells stringByAppendingPathComponent:[NSString stringWithFormat:@"d%i%@",i,@".caf"]]]){
nextFile = [savedDBells stringByAppendingPathComponent:[NSString stringWithFormat:@"d%i%@",i,@".caf"]];
break;
}
}
NSURL *url = [[NSURL alloc] initFileURLWithPath:nextFile];
NSDictionary *setup = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithInt:kAudioFormatMPEG4AAC],AVFormatIDKey,
[NSNumber numberWithInt:44100.0],AVSampleRateKey,
[NSNumber numberWithInt: 2],AVNumberOfChannelsKey,
[NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,
[NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
[NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
nil];
NSError *err;
NSLog(@"%@",url);
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:setup error:&err];
[setup release];
[url release];
//Gradient code
/*
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = self.view.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor] CGColor], (id)[[UIColor blackColor] CGColor], nil];
[self.view.layer insertSublayer:gradient atIndex:0];
*/
}
-(IBAction) actionButtonPressed: (id) sender{
NSLog(@"%@",actionButton.titleLabel.text);
if ([actionButton.titleLabel.text isEqual:@"Finish Recording"]){
BOOL test = recorder.recording;
NSLog(@"Recording property = %i",test);
[upCounter invalidate];
[recorder stop];
[self dismissModalViewControllerAnimated:YES];
}
if ([actionButton.titleLabel.text isEqual:@"Begin Recording"]){
upCounter = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:upCounter forMode:NSDefaultRunLoopMode];
[actionButton setTitle:@"Finish Recording" forState:UIControlStateNormal];
[actionButton setBackgroundImage:[[UIImage imageNamed:@"bigredbutton.png"] stretchableImageWithLeftCapWidth:10.0 topCapHeight:0.0] forState:UIControlStateNormal];
NSLog(@"Recorder record = %i",[recorder record]);
}
}
В другом представлении контроллер:
-(IBAction) recordingButtonPressed:(id) sender{
AVAudioSession *avs = [AVAudioSession sharedInstance];
//Test for written folder
/*NSFileManager *fileMan = [NSFileManager defaultManager];
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
*/
if (avs.inputIsAvailable){
NSString *recordedFile;
RecordingViewController *recorderVC = [[RecordingViewController alloc] initWithNibName:@"RecordingViewController" bundle:nil];
recorderVC.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentModalViewController:recorderVC animated:YES];
recordedFile = [recorderVC.recorder.url absoluteString];
[recorderVC release];
self.currentSoundPath = recordedFile;
NSLog(@"%@",currentSoundPath);
/*if ([fileMan fileExistsAtPath:recordedFile]){
UIActionSheet *overwrite = [[UIActionSheet alloc] initWithTitle:@"Overwrite the current doorbell recording?" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Overwrite" otherButtonTitles:nil];
overwrite.delegate = self;
[overwrite showInView:self.view];
[overwrite release];
}*/
/*NSDictionary *recorderSettingsDict=[[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithInt:kAudioFormatAppleIMA4],AVFormatIDKey,
[NSNumber numberWithInt:44100.0],AVSampleRateKey,
[NSNumber numberWithInt: 2],AVNumberOfChannelsKey,
[NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,
[NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
[NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
nil];
AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:recordedFile settings:<#(NSDictionary *)settings#> error:<#(NSError **)outError#>];*/
}
else{
UIAlertView *noAudio = [[UIAlertView alloc] initWithTitle:@"No microphone connected" message:@"Please connect a microphone to record a doorbell." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[noAudio show];
[noAudio release];
}
}
2 ответа
Единственное, что бросается в глаза, это то, что вы звоните [NSNumber numberWithInt:44100.0] вместо numberWithDouble.
Хотя это может быть и не проблема этого кода, в моем случае невозможность воспроизведения записанного аудиофайла была вызвана тем, что он не вызывал [audioRecorder stop]
, У меня был код на месте, так как ссылка на мой аудиоплеер была равна нулю, когда он добрался до кода, который должен был вызвать остановку, поэтому используйте отладчик, чтобы убедиться, что когда вы говорите остановке записи, у вас все еще есть ссылка на аудиорекордер.