2011-04-14 13 views
13

Intenté usar AVAudioSession y AVAudioPlayer para grabar y reproducir sonidos, respectivamente, pero el volumen del sonido es muy bajo.¿Cómo grabar y reproducir sonido en la aplicación iPhone?

Intenté poner el valor de volumen de AVAudioPlayer a 1.0 y más pero no ayudé mucho.

¿Cuáles podrían ser mis otras opciones para grabar sonido que puede ser lo suficientemente fuerte como para reproducir?

+0

¿Está utilizando el micrófono incorporado, o el micrófono que está en el cable de los auriculares estándar? ¿Qué tan cerca está la fuente del sonido para el micrófono? ¿Qué tipo de valores está viendo si registra -peakPowerForChannel? – NSResponder

+0

@NSResponder: estoy usando un micrófono incorporado. ¿También puede explicar cómo registrar -peakPowerForChannel? –

Respuesta

25

Este código debe ser útil para Usted:

#import <AudioToolbox/AudioServices.h> 

    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;     
    AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,   
           sizeof (audioRouteOverride),&audioRouteOverride); 

Se aumentará el volumen. La funcionalidad del código es convertir el sonido normal en sonido de altavoz en tu iPhone. Es por eso que se usa kAudioSessionOverrideAudioRoute_Speaker.

+0

Gracias por la entrada. Lo verificaré y te contestaremos pronto :) –

+0

Muchas gracias, esto funcionó :) Estaba buscando una solución para esto desde un día. –

+3

No olvide la declaración de importación. Tal vez sea obvio para los programadores más experimentados ... #import MaKo

1

El siguiente código corregido este problema para mí:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error: nil]; 
[[AVAudioSession sharedInstance] setActive: YES error: nil]; 
UInt32 doChangeDefault = 1; 
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefault), &doChangeDefault); 
23

Desde iOS7 se puede solucionar este problema directamente con AVAudioSession

El método overrideOutputAudioPort hace lo mismo que AudioSessionSetProperty

NSError *setOverrideError; 
NSError *setCategoryError; 

AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&setCategoryError]; 

if(setCategoryError){ 
    NSLog(@"%@", [setCategoryError description]); 
} 

[session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&setOverrideError]; 


if(setOverrideError){ 
    NSLog(@"%@", [setOverrideError description]); 
} 
+0

esta línea me salvó la vida, gracias hombre [session overrideOutputAudioPort: AVAudioSessionPortOverrideSpeaker error: & setOverrideError]; –

0

HOMBRE , prueba esto.

AVAudioSession *session = [AVAudioSession sharedInstance]; 

NSError *setCategoryError = nil; 
if (![session setCategory:AVAudioSessionCategoryPlayback 
       withOptions:kAudioSessionOverrideAudioRoute_Speaker 
        error:&setCategoryError]) { 
     // handle error 
} 

NSError *error; 
NSData * data = [NSData dataWithContentsOfURL:self.playlet.urlSound]; 

self.audioPlayer = [[AVAudioPlayer alloc] initWithData:data fileTypeHint:@"aac" error:&error]; 

self.audioPlayer.delegate = self; 

if (error) 
    NSLog(@"Error: %@", 
      [error localizedDescription]); 
else 
    [_audioPlayer play]; 
0

apenas se fija este [sesión de overrideOutputAudioPort: error AVAudioSessionPortOverrideSpeaker: & setOverrideError]; Funciona para mí.

4

versión Swift:

import AVFoundation 
var overrideError : NSError? 
    if AVAudioSession.sharedInstance().overrideOutputAudioPort(.Speaker, error: &error){ 

    }else{ 
     print("error in overrideOutputAudioPort " + overrideError!.localizedDescription) 
    } 

Swift 2:

 do { 
     try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.Speaker) 
     } catch { 
     } 
+0

Con Swift 2, ahora es una situación de prueba de captura, sin necesidad de anular el error opcional – blwinters

+0

thnx, edité la respuesta –

Cuestiones relacionadas