2010-04-18 17 views
5

ho ottenuto il seguente codice:AVAudioPlayer tramite altoparlanti

- (id)init { 
    if (self = [super init]) { 
     UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 
     AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);  

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

     [[AVAudioSession sharedInstance] setDelegate:self]; 
     [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; 
     [[AVAudioSession sharedInstance] setActive:YES error:nil]; 
    } 
    return self; 
} 

Ma in qualche modo il suono non vuole uscire dagli altoparlanti, qualcuno può vedere quello che sto facendo male?

Il codice che uso per il gioco è:

AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFilePathURL error:nil]; 
[player prepareToPlay]; 
[player setVolume:1.0]; 
[player play]; 
+1

il codice sia corretto per me (io sono usando abbastanza lo stesso e funziona). forse basta controllare che non venga restituito alcun errore invece di passare nil. Errore NSError *; [[AVAudioSession sharedInstance] setActive: YES error: & error]; per assicurarti che la tua sessione audio sia a posto. – yonel

risposta

2

ho usato il quadro AudioToolbox Ecco perché ho inizializzato la mia sessione audio come segue:

AudioSessionInitialize(NULL, NULL, NULL, NULL); 

Ecco il resto del mio codice che ho usato per configurare la sessione audio. Non ho ignorato il percorso audio e penso anche che non sia necessario.

UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 
OSStatus err = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, 
             sizeof(sessionCategory), 
             &sessionCategory); 
AudioSessionSetActive(TRUE); 
if (err) { 
    NSLog(@"AudioSessionSetProperty kAudioSessionProperty_AudioCategory failed: %d", err); 
} 
+0

Come usare questo in IOS8? – Anoop

+0

Cristina ha aggiunto la risposta a ciò che funziona in iOS 7+ –

1

Il codice per riprodurre il suono sembra corretto e non c'è motivo per cui dovresti usare AudioToolbox. Una cosa che dovresti accertarti è che stai usando i formati audio supportati. (Personalmente ho avuto successo con MP3 e WAV)

Inoltre, potresti condividere con noi il tuo codice su come ottenere l'url per il tuo file audio?

2

Ho intenzione di chiarire questo per altri lettori di questo post.

Stavo cercando la risposta a questo problema, in particolare per l'esempio SpeakHere. Ho afferrato questo piccolo pezzo di codice e ha fatto il trucco.

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

Spero che non si tratti di una digressione. Ho solo pensato che sarebbe stato buono per chi ha solo bisogno di queste due piccole affermazioni.

4

E 'pignoli su come lo si imposta ...

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; 
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride); 

E' molto importante utilizzare AVAudioSessionCategoryPlayAndRecord o il percorso non riuscirà a passare al diffusore. Una volta impostato il percorso di override per la sessione audio, è possibile utilizzare un'istanza AVAudioPlayer e inviare un po 'di output all'altoparlante.

Spero che funzioni per altri come ha fatto per me. La documentazione su questo è sparpagliata, ma l'app Skype dimostra che è possibile. Perseverate, amici miei! :)

Alcuni documentazione di Apple qui: http://developer.apple.com/library/ios/#documentation/AudioToolbox/Reference/AudioSessionServicesReference/Reference/reference.html

fare una ricerca sulla pagina per kAudioSessionProperty_OverrideAudioRoute

3

ottimo esempio qui http://ruckt.info/playing-sound-through-iphone-speaker/ risolto il mio problema.

Il metodo seguente - configureAVAudioSession - reindirizza l'audio ai diffusori principali in iOS 7.0. Per fare ciò, chiamalo prima di riprodurre l'audio in questo modo: [self configureAVAudioSession].

- (void) configureAVAudioSession //To play through main iPhone Speakers 
{ 
    //get your app's audioSession singleton object 
    AVAudioSession* session = [AVAudioSession sharedInstance]; 

    //error handling 
    BOOL success; 
    NSError* error; 

    //set the audioSession category. 
    //Needs to be Record or PlayAndRecord to use audioRouteOverride: 

    success = [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error]; 

    if (!success) 
    { 
     NSLog(@"AVAudioSession error setting category:%@",error); 
    } 
    //set the audioSession override 
    success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error]; 
    if (!success) 
    { 
     NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error); 
    } 
    //activate the audio session 
    success = [session setActive:YES error:&error]; 
    if (!success) 
    { 
     NSLog(@"AVAudioSession error activating: %@",error); 
    } 
    else 
    { 
     NSLog(@"audioSession active"); 
    } 
} 
0

Prova questo:

NSError *error; 
AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];  
if(error) { 
    NSLog(@"STKAudioManager: AudioSession cannot use speakers"); 
} 
+0

ERRORE: AVAudioSessionUtilities.mm:105: getUInt32: - Il convertitore di valore di categoria non è riuscito a trovare una corrispondenza per la soluzione "Receiver" plz stringa questo problema. –

+0

Scusa, non conosco la soluzione per il tuo problema @ P.J.Radadiya –

+0

Grazie @Yunus Nedim Mehel –

1

Mentre le altre risposte forniscono l'effetto desiderato di riproduzione audio sul diffusore invece del ricevitore, che non sono il modo idiomatico per raggiungere tale obiettivo.

Uno dovrebbe piuttosto usare il AVAudioSessionCategoryOption (che boccone) DefaultToSpeaker. La documentazione per che legge (sottolineatura mia):

When using this option and no other audio route (such as a headset) is available, session audio will play through the device’s built-in speaker. When not using this option, and no other audio output is available or selected, audio will play through the receiver (a speaker intended to be held to the ear). Note that only iPhone devices are equipped with a receiver; on iPad and iPod touch devices, this option has no effect.

Per utilizzare questo, cambiare la vostra chiamata a setCategory: a passare l'opzione, in questo modo:

let session = AVAudioSession.sharedInstance() 
try session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: [.DefaultToSpeaker]) 
Problemi correlati