2010-04-18 5 views
5

j'ai obtenu le code suivant:AVAudioPlayer via haut-parleurs

- (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; 
} 

Mais en quelque sorte le son ne veut pas sortir des haut-parleurs, quelqu'un peut voir ce que je fais mal?

Le code que j'utilise pour jouer est:

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

Votre code semble correct pour moi (je suis en utilisant tout à fait la même chose et cela fonctionne). peut-être juste vérifier que Pas d'erreur est de retour au lieu de passer nul. Erreur NSError *; [[AVAudioSession sharedInstance] setActive: erreur YES: & erreur]; pour être sûr que votre session audio est bien. – yonel

Répondre

2

J'ai utilisé le cadre de AudioToolbox qui est pourquoi j'initialisés ma session audio comme suit:

AudioSessionInitialize(NULL, NULL, NULL, NULL); 

Voici le reste de mon code que je pour configurer la session audio. Je n'ai pas outrepassé la route audio et je pense aussi que ce n'est pas nécessaire.

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

Comment l'utiliser dans IOS8? – Anoop

+0

Cristina ajouté réponse ce qui fonctionne bien dans iOS 7+ –

1

Vous êtes un code pour jouer le son semble correct, et il n'y a aucune raison que vous devriez utiliser AudioToolbox. Une chose que vous pourriez vouloir vous assurer est que vous utilisez des formats audio supportés. (Personnellement, j'ai eu du succès avec MP3 et WAV)

En outre, pourriez-vous partager avec nous votre code quant à la façon dont vous obtenez l'URL de votre fichier audio?

2

Je vais juste clarifier cela pour les autres lecteurs de ce post.

Je cherchais la réponse à ce problème, en particulier pour l'exemple SpeakHere. J'ai attrapé ce petit morceau de code et ça a fait l'affaire.

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

J'espère que ce n'est pas trop d'une digression. Je pensais juste que ce serait bon pour ceux qui ont juste besoin de ces deux petites déclarations.

4

Il est pointilleux sur la façon dont vous le configurer ...

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

Il est très important d'utiliser AVAudioSessionCategoryPlayAndRecord ou la route ne parviendra pas à aller au haut-parleur. Une fois que vous avez défini l'itinéraire de remplacement pour la session audio, vous pouvez utiliser une instance AVAudioPlayer et envoyer une sortie au haut-parleur.

Espérons que cela fonctionne pour les autres comme il l'a fait pour moi. La documentation sur ce sujet est dispersée, mais l'application Skype prouve que c'est possible. Persévérez, mes amis! :)

Certains documents d'Apple ici: http://developer.apple.com/library/ios/#documentation/AudioToolbox/Reference/AudioSessionServicesReference/Reference/reference.html

Effectuez une recherche sur la page pour kAudioSessionProperty_OverrideAudioRoute

3

Très bon exemple http://ruckt.info/playing-sound-through-iphone-speaker/ résolu mon problème.

La méthode ci-dessous - configureAVAudioSession - redirige l'audio vers les haut-parleurs principaux dans iOS 7.0. Pour ce faire, appelez-le avant de lire l'audio de cette manière: [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

Essayez ceci:

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

ERREUR: AVAudioSessionUtilities.mm:105: getUInt32: - Catégorie Value Converter n'a pas réussi à trouver une correspondance pour la chaîne "Receiver" solution plz ce problème. –

+0

Désolé, je ne connais pas la solution à votre problème @ P.J.Radadiya –

+0

Merci @Yunus Nedim Mehel –

1

Alors que les autres réponses fournissent l'effet désiré de la lecture audio sur le haut-parleur au lieu du récepteur, ils ne sont pas la voie idiomatiques pour atteindre cet objectif.

On devrait plutôt utiliser le AVAudioSessionCategoryOption (quelle bouchée) DefaultToSpeaker. La documentation qui lit (Souligné par l'auteur):

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.

Pour utiliser cela, changer votre appel à setCategory: passer l'option, comme ceci:

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