2011-10-12 41 views
6

Estoy creando una aplicación usando monotouch. Básicamente, necesito reproducir un mp3 tan pronto como se cargue la aplicación. En los main.cs que añade este fragmento antes de empujar el controlador principal:reproducir 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(); 
} 

Pero cuando comienzo a la aplicación que se puede escuchar el sonido durante aproximadamente medio segundo y luego nada. ¿Este código es correcto o hay algún problema?

Gracias

Respuesta

7

Es difícil dar una respuesta sin más contexto, al igual que más código :-)

Sospecho que su AVAudioPlayer, si se utiliza como una variable local, podría ser recogidos por el recolector de basura (GC) cuando el método (¿es FinishedLaunching?) devuelve.

Si este es el caso, entonces promover su player variable local en un campo aseguraría una referencia se mantiene a la AVAudioPlayer instancia y debe permitirle desempeñar sin ser interrumpido (o chocar).

Si me equivoco, por favor edite su pregunta y nos proporcione más contexto y deberíamos poder ayudarle más.

+0

acabo de llamar a una función para reproducir el audio desde el interior public override bool FinishedLaunching (aplicación UIApplication, Opciones de NSDictionary) { PlayAudio(); } y la función PlayAudio contiene el código de mi pregunta – iFrankz

+0

Disculpe, ¿el estado no es claro? ¿Funciona (lo asumiré desde que aceptó la respuesta)? Lo importante a recordar es que el 'player' continúa trabajando/jugando * después de que' 'FinishedLaunching' regrese, por lo que la instancia de ese objeto todavía tiene que estar * alive * (y no recopilada). – poupou

+0

Sí promocioné la variable en un campo y funcionó. Supongo que el problema estaba relacionado con la acción del GC. Muchas gracias poupou – iFrankz

0

Trate de registrarse para el AVAudioPlayerDelegate y comenzar la música de nuevo otra vez en el método audioPlayerEndInterruption.

+0

Hola Ralfonso, gracias por su respuesta. Intenté algo como esto: 'AVAudioPlayer player = new AVAudioPlayer();' 'NSUrl mediaFile = NSUrl.FromFilename (" Contenido/Audio/music1.mp3 ");' 'player = AVAudioPlayer.FromUrl (mediaFile);' 'player.Delegate = new AVAudioPlayerDelegate();' \t \t \t 'player.EndInterruption + = delegado (remitente del objeto, EventArgs e) {' ' player.Play();' ' };' \t \t \t 'if (player.PrepareToPlay()) {' 'player.Play();' '}' Pero ahora es incluso peor. La aplicación falla cuando comienza a jugar – iFrankz

+1

No estoy muy familiarizado con MonoTouch, pero sé que cuando se desarrolla en Objective-C, Xcode hace muchas cosas silenciosamente cuando se agregan recursos al proyecto. Asegúrese de que no haya posibles errores de formato de archivo (pruebe con .wav) o cargue el archivo desde el paquete principal. Un ejemplo es aquí: [link] http://www.techotopia.com/index.php/Playing_Audio_on_an_iPhone_using_AVAudioPlayer_ (iOS_4) #Support_Audio_Formats – Ralfonso

0

Ahora es muy fácil:

  //enable audio 
      AudioSession.Initialize(); 

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