2011-10-12 25 views
6

Buduję aplikację za pomocą monotouch. Zasadniczo muszę odtworzyć plik mp3 zaraz po załadowaniu aplikacji. Na main.cs dodałem ten fragment przed pchania główny sterownik:odtwarzanie mp3 z 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(); 
} 

Ale kiedy uruchomić aplikację słyszę dźwięk przez około pół sekundy, a potem nic. Czy ten kod jest prawidłowy, czy coś jest nie tak?

Dzięki

Odpowiedz

7

Trudno udzielić odpowiedzi bez dalszych kontekście, jak więcej kodu :-)

Podejrzewam swój AVAudioPlayer, jeżeli są stosowane jako zmiennej lokalnej, mogą być zbierane przez garbage collector (GC), gdy metoda (czy to jest FinishedLaunching?) zwraca.

Jeśli jest to przypadek następnie promowanie lokalnego player zmiennej w polu zapewniłby odwołanie jest ograniczone do instancji AVAudioPlayer i powinna pozwolić mu grać bez przerwane (lub awarii).

Jeśli się mylę, proszę edytuj swoje pytanie i podaj nam więcej kontekstu, a my powinniśmy być w stanie Ci pomóc.

+0

Po prostu wywołuję funkcję odtwarzania dźwięku z wnętrza public override bool FinishedLaunching (aplikacja UIApplication, Opcje NSDictionary) { PlayAudio(); } i funkcja PlayAudio zawiera kod na moje pytanie – iFrankz

+0

Niestety, status nie jest jasny? czy to działa (przyjmę to, odkąd przyjąłeś odpowiedź)? Ważną rzeczą do zapamiętania jest to, że 'player' kontynuuje pracę/grę * po tym, jak * zwróci" FinishedLaunching ", więc instancja tego obiektu musi nadal być * żywa * (i nie może być zebrana). – poupou

+0

Tak, wypromowałem zmienną w polu i zadziałało. Zakładam, że problem był związany z działaniem GC. Wielkie dzięki poupou – iFrankz

0

Spróbuj rejestracji dla AVAudioPlayerDelegate i podtrzymują znowu zaczynając muzykę w metodzie audioPlayerEndInterruption.

+0

Hi Ralfonso, dzięki za odpowiedź. Próbowałem czegoś takiego: 'AVAudioPlayer player = new AVAudioPlayer();' 'NSUrl mediaFile = NSUrl.FromFilename (" Content/Audio/music1.mp3 ");' 'player = AVAudioPlayer.FromUrl (mediaFile);' 'player.Delegate = nowy AVAudioPlayerDelegate();' \t \t \t 'player.EndInterruption + = pełnomocnik (obiektu nadawcy EventArgs e) {' 'player.Play();' '};' \t \t \t 'if (player.PrepareToPlay()) {' 'player.Play();' '}' Ale teraz jest jeszcze najgorsze. Aplikacja ulega awarii, gdy zaczyna grać – iFrankz

+1

Nie jestem zbyt zaznajomiony z MonoTouch, ale wiem, że podczas rozwijania w Objective-C, Xcode robi wiele rzeczy po cichu, gdy zasoby są dodawane do projektu. Upewnij się, że nie ma możliwych błędów w formacie pliku (spróbuj .wav) lub załaduj plik z głównego pakietu. Przykład znajduje się tutaj: [link] http://www.techotopia.com/index.php/Playing_Audio_on_an_iPhone_using_AVAudioPlayer_ (iOS_4) #Support_Audio_Formats – Ralfonso

0

Teraz to naprawdę proste:

  //enable audio 
      AudioSession.Initialize(); 

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