AVAudioRecorder & отладчик останавливается без сигнала - PullRequest
0 голосов
/ 22 августа 2011

Мне нужно записать аудиопоток с микрофона iPhone.Я использую AVAudioRecorder из этой вещи.

Я инициализирую AVAR в init:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachePath = [[paths objectAtIndex:0] retain];
NSError *error;
BOOL isDir = NO;
if (! [[NSFileManager defaultManager] fileExistsAtPath:cachePath isDirectory:&isDir] && isDir == NO) {
    [[NSFileManager defaultManager] createDirectoryAtPath:cachePath withIntermediateDirectories:NO attributes:nil error:&error];
}

pathNewFile=  [cachePath stringByAppendingPathComponent:@"123.caf"];

NSLog(@"%@",pathNewFile);

NSDictionary *settings=[[NSDictionary alloc]initWithObjectsAndKeys:
                               [NSNumber numberWithFloat:44100.0f],AVSampleRateKey,
                                    [NSNumber numberWithInt:kAudioFormatAppleLossless],AVFormatIDKey,
                                    [NSNumber numberWithInt:1],AVNumberOfChannelsKey,
                                    [NSNumber numberWithInt:AVAudioQualityMax],AVEncoderAudioQualityKey, nil];
recorder=[[AVAudioRecorder alloc] initWithURL:[NSURL URLWithString:pathNewFile] settings:settings error:nil];
[recorder prepareToRecord];

И начинаю запись, когда пользователь нажимает кнопку записи:

-(void)recButton:(id)sender{
    NSLog(@"start rec");
        [rootNotesButton setTitle:@"Stop" forState:UIControlStateNormal];
            [rootNotesButton removeTarget:self action:@selector(recButton:) forControlEvents:UIControlEventTouchUpInside];
            [rootNotesButton addTarget:self action:@selector(stopButton:) forControlEvents:UIControlEventTouchUpInside];
            [recorder record];
}

-(void)stopButton:(id)sender{
            NSLog(@"stop rec");
            [rootNotesButton setTitle:@"Play" forState:UIControlStateNormal];
            [rootNotesButton removeTarget:self action:@selector(stopButton:) forControlEvents:UIControlEventTouchUpInside];
            [rootNotesButton addTarget:self action:@selector(playButton:) forControlEvents:UIControlEventTouchUpInside];
            [recorder stop];
}

-(void)playButton:(id)sender{
        NSLog(@"play rec");
            [rootNotesButton setTitle:@"Stop" forState:UIControlStateNormal];
            [rootNotesButton removeTarget:self action:@selector(playButton:) forControlEvents:UIControlEventTouchUpInside];
            [rootNotesButton addTarget:self action:@selector(stopPButton:) forControlEvents:UIControlEventTouchUpInside];

            player=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL URLWithString:pathNewFile] error:nil];
            [player play];
}

-(void)stopPButton:(id)sender{
        NSLog(@"Stop play");
            [rootNotesButton setTitle:@"Play" forState:UIControlStateNormal];
            [rootNotesButton removeTarget:self action:@selector(stopPButton:) forControlEvents:UIControlEventTouchUpInside];
            [rootNotesButton addTarget:self action:@selector(playButton:) forControlEvents:UIControlEventTouchUpInside];
            [player stop];
}

Но когда я пытаюсь запустить свой проект в симуляторе: мой отладчик останавливается на строке: Recorder = [[AVAudioRecorder alloc] initWithURL: [NSURL URLWithString: pathNewFile] настройки: ошибка настроек: ноль];Без каких-либо сигналов или ошибок.

1 Ответ

0 голосов
/ 22 августа 2011

Проблема, кажется, связана с записью в cachePath в симуляторе.Я попробовал это, и это сработало:

#if TARGET_IPHONE_SIMULATOR
    NSString *cachePath = @"/tmp";
#else
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cachePath = [[paths objectAtIndex:0] retain];
#endif

У вас есть пара утечек памяти:

  1. Вы сохраняете cachePath, но не освобождаете его.На самом деле нет оснований сохранять его в первую очередь.

  2. Вы создаете player с +alloc/-init в playButton, что означает, что вы владеете им, но не выпускаете его (по крайней мере, не в опубликованном коде).Если вы определяете его как property, вам нужно использовать self.player = …, чтобы правильно его сохранить и освободить.

  3. Вы создаете settings с +alloc/-initно не выпуская это.Там нет причин для этого.Вместо этого вы можете создать его следующим образом:

NSDictionary *settings=[NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithFloat:44100.0f],AVSampleRateKey, [NSNumber numberWithInt:kAudioFormatAppleLossless],AVFormatIDKey, [NSNumber numberWithInt:1],AVNumberOfChannelsKey, [NSNumber numberWithInt:AVAudioQualityMax],AVEncoderAudioQualityKey, nil];

Вам необходимо сохранить pathNewFile, поскольку stringByAppendingPathComponent возвращает автоматически выпущенную строку, и вы используете ее вдругие методы вашего класса.

...