2011-10-12 18 views
6

Sto costruendo un'applicazione utilizzando monotouch. Fondamentalmente ho bisogno di riprodurre un mp3 non appena l'applicazione carica. Sulle main.cs ho aggiunto questo frammento prima di premere il controller principale:riprodurre mp3 con 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(); 
} 

Ma quando inizio l'applicazione che può sentire il suono per circa mezzo secondo e poi più nulla. Questo codice è corretto o c'è qualcosa di sbagliato?

Grazie

risposta

7

E 'difficile fornire una risposta senza più contesto, come più codice :-)

Ho il sospetto che il tuo AVAudioPlayer, se usato come una variabile locale, potrebbero essere raccolti dal garbage collector (GC) quando il metodo (è FinishedLaunching?) restituisce.

Se questo è il caso allora promuovere tua player variabile locale in un campo garantirebbe un riferimento viene mantenuto all'istanza AVAudioPlayer e dovrebbe consentire di svolgere senza essere interrotti (o crash).

Se ho torto, per favore, per favore, modifica la tua domanda e forniscici più contesto e dovremmo essere in grado di aiutarti ulteriormente.

+0

mi basta chiamare una funzione per riprodurre l'audio da dentro public override bool FinishedLaunching (UIApplication app, Opzioni NSDictionary) { PlayAudio(); } e la funzione PlayAudio contiene il codice sulla mia domanda – iFrankz

+0

Siamo spiacenti, lo stato non è chiaro? funziona (presumo che tu abbia accettato la risposta)? La cosa importante da ricordare è che il 'player' continua a funzionare/riprodurre * dopo * i ritorni di" FinishedLaunching ", quindi l'istanza di quell'oggetto deve ancora essere * alive * (e non raccolta). – poupou

+0

Sì, ho promosso la variabile in un campo e ha funzionato. Presumo che il problema fosse correlato all'azione del GC. Molte grazie poupou – iFrankz

0

Prova a registrarti per l'AVAudioPlayerDelegate e di iniziare la musica torna di nuovo nel metodo audioPlayerEndInterruption.

+0

Ciao Ralfonso, grazie per la risposta. Ho provato qualcosa del genere: 'AVAudioPlayer player = new AVAudioPlayer();' 'NSUrl mediaFile = NSUrl.FromFilename (" Content/Audio/music1.mp3 ");' 'player = AVAudioPlayer.FromUrl (mediaFile);' 'player.Delegate = new AVAudioPlayerDelegate();' \t \t \t 'player.EndInterruption + = delegato (object sender, EventArgs e) {' ' player.Play();' ' };' \t \t \t 'if (player.PrepareToPlay()) {' 'player.Play();' '}' Ma ora è anche peggio. L'applicazione si interrompe quando inizia a giocare – iFrankz

+1

Non ho molta familiarità con MonoTouch, ma so che quando si sviluppa in Objective-C, Xcode fa molte cose in silenzio quando le risorse vengono aggiunte al progetto. Assicurati che non ci siano errori nel formato dei file (prova un .wav) o carica il file dal pacchetto principale. Un esempio è qui: [link] http://www.techotopia.com/index.php/Playing_Audio_on_an_iPhone_using_AVAudioPlayer_ (iOS_4) #Support_Audio_Formats – Ralfonso

0

Ora è veramente facile:

  //enable audio 
      AudioSession.Initialize(); 

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