Различия в поведении AVAudioRecorder в iOS 4.1 и iOS3.1.3 - PullRequest
0 голосов
/ 25 октября 2010

Я хочу проигрывать аудио, когда кто-то говорит в микрофон iPhone. Этот код прекрасно работает в iPhone 2G (OS 3.1.3), но когда он тестируется в iPhone 4, он не работает. Я проверил различия API и методов, но не смог найти их.

- (void)viewDidLoad {

NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/Audio.mp3", [[NSBundle mainBundle] resourcePath]]];

NSError *error;
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
audioPlayer.delegate=self;
if (audioPlayer == nil)
    NSLog(@" %@ ", [error description]);

audioSession = [[AVAudioSession sharedInstance] retain];
[audioSession setActive:YES error: nil];


[super viewDidLoad]; }

Событие действия:

-(IBAction) micAction{

[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error: nil];
NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];

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

NSError *error;

recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];

if (recorder) {
    [recorder prepareToRecord];
    recorder.meteringEnabled = YES;
    [recorder record];
    levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: NO];
} }

- (void)levelTimerCallback:(NSTimer *)t {
[recorder updateMeters];
if([recorder averagePowerForChannel:0]>-38){
    if ([audioPlayer prepareToPlay]) {
        [recorder stop];
        [recorder release];
        [levelTimer invalidate];
        [self playSound];   
    }
}}  

-(void)playSound{
[audioSession setCategory:AVAudioSessionCategoryPlayback error: nil];
if ([audioPlayer prepareToPlay])
    [audioPlayer play]; }

Чтобы убедиться, что звук воспроизводится в iPhone 4, я также настроил событие IBAction, которое работает нормально. Также для тестирования я бы настроил метку для отображения значения

[recorder averagePowerForChannel:0

после нажатия кнопки. Эта метка обновляется согласно таймеру в 2G, но в iPhone 4 она отображает только одно значение в событии щелчка.

Я не могу отладить поведение метода в iPhone 4, так как сейчас у меня нет устройства.

Может кто-нибудь указать, в чем ошибка?

Спасибо

Ответы [ 2 ]

0 голосов
/ 03 ноября 2010

Нашел решение. Проблема была в этой строке:

levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: NO];

Поскольку для повторов установлено значение NO, таймер использовался только один раз. Таким образом, непрерывный мониторинг значения AveragePowerForChannel не может быть выполнен. После установки значения YES код работает отлично.

0 голосов
/ 26 октября 2010

Вы пытались сохранить в файл вместо / dev / null?

...