Je veux jouer un son quand quelqu'un parle dans le micro de l'iPhone. Ce code fonctionne parfaitement dans l'iPhone 2G (OS 3.1.3), mais quand il est testé dans l'iPhone 4, il ne fonctionne pas. J'ai vérifié les différences d'API et de méthode, mais je n'en ai trouvé aucune.Différences de comportement de AVAudioRecorder dans iOS 4.1 et iOS3.1.3
- (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]; }
L'événement d'action:
-(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]; }
Pour vous assurer que l'audio joue dans l'iPhone 4, je également mis en place un événement IBAction, qui fonctionne très bien. En outre, pour tester, je définirais une étiquette pour afficher la valeur de
[recorder averagePowerForChannel:0
après avoir appuyé sur le bouton. Cette étiquette se met à jour selon la minuterie en 2G, mais dans l'iPhone 4, elle n'affiche qu'une valeur sur l'événement click. Je suis incapable de déboguer le comportement de la méthode dans l'iPhone 4 puisque je n'ai pas l'appareil avec moi maintenant.
Quelqu'un peut-il s'il vous plaît préciser ce qu'est l'erreur?
Merci
havent encore, je le ferai maintenant. sera affiché le résultat. merci beaucoup –
pas de chance, ça ne marche pas. –