2011-10-12 3 views
6

Je construis une application en utilisant monotouch. Fondamentalement, j'ai besoin de jouer un mp3 dès que l'application se charge. Sur les main.cs j'ai ajouté cet extrait avant de pousser le contrôleur principal:jouer mp3 avec monotouch

AVAudioPlayer player = new AVAudioPlayer(); 
NSUrl mediaFile = NSUrl.FromFilename("Content/Audio/music1.mp3"); 

player = AVAudioPlayer.FromUrl(mediaFile); 
player.Delegate = new PlayerDelegate(); 

if(player.PrepareToPlay()){ 
    player.Play(); 
} 

Mais quand je commence l'application que je peux entendre le son pendant environ une demi seconde, puis rien. Ce code est-il correct ou quelque chose ne va pas?

Merci

Répondre

7

Il est difficile de fournir une réponse sans plus de contexte, comme plus de code :-)

Je soupçonne votre AVAudioPlayer, si elle est utilisée comme variable locale, pourrait être recueillie par le collecteur d'ordures (GC) lorsque la méthode (est-ce FinishedLaunching?) renvoie.

Si tel est le cas, alors promotion votre variable player locale dans un champ assurerait une référence est maintenue à elle par exemple AVAudioPlayer et devrait permettre de jouer sans être interrompu (ou écraser).

Si je me trompe alors s'il vous plaît éditer votre question et nous fournir plus de contexte et nous devrions pouvoir vous aider davantage.

+0

j'appelle simplement une fonction de lecture audio à l'intérieur public override bool FinishedLaunching (app UIApplication, Options NSDictionary) { PlayAudio(); } et la fonction PlayAudio contient le code sur ma question – iFrankz

+0

Désolé, le statut n'est pas clair? ça marche (je suppose que vous avez accepté la réponse)? Le bit important à retenir est que le 'player' continue à fonctionner/à jouer * après le retour de' 'FinishedLaunching', donc l'instance de cet objet doit toujours être * vivante * (et non collectée). – poupou

+0

Oui, j'ai promu la variable dans un champ et cela a fonctionné. Je présume que le problème était lié à l'action du GC. Merci beaucoup poupou – iFrankz

0

Essayez de vous enregistrer pour le AVAudioPlayerDelegate et reculant à nouveau la musique dans la méthode audioPlayerEndInterruption.

+0

Salut Ralfonso, merci pour votre réponse. J'ai essayé quelque chose comme ceci: 'AVAudioPlayer player = nouveau AVAudioPlayer();' 'NSUrl mediaFile = NSUrl.FromFilename (" Contenu/Audio/music1.mp3 ");' 'lecteur = AVAudioPlayer.FromUrl (mediaFile);' 'player.Delegate = new AVAudioPlayerDelegate();' \t \t \t 'player.EndInterruption + = délégué (expéditeur d'objet, EventArgs e) {' ' player.Play();' ' };' \t \t \t 'if (player.PrepareToPlay()) {' 'player.Play();' '}' Mais maintenant c'est encore pire. L'application plante quand elle commence à jouer – iFrankz

+1

Je ne connais pas trop MonoTouch, mais je sais que lors du développement en Objective-C, Xcode fait beaucoup de choses en silence lorsque des ressources sont ajoutées au projet. Assurez-vous qu'il n'y a pas d'erreurs de format de fichier possibles (essayez un fichier .wav) ou chargez le fichier à partir de l'ensemble principal. Un exemple est ici: [lien] http://www.techotopia.com/index.php/Playing_Audio_on_an_iPhone_using_AVAudioPlayer_ (iOS_4) #Support_Audio_Formats – Ralfonso

0

Maintenant, il est vraiment facile:

  //enable audio 
      AudioSession.Initialize(); 

      //load the sound 
      sound = SystemSound.FromFile("Sounds/rev.wav"); 
      sound.PlaySystemSound();