2011-01-09 12 views
19

sto testando il mio app sul mio iPhone 3GS con iOS 4.2MP3 riproduzione con AVAudioPlayer non funziona sul dispositivo

Sto usando il seguente codice che riproduce un suono nel mio IBAction. Funziona perfettamente nel simulatore (sia iPad che iPhone) - sento il suono.

NSString *pathToMusicFile1 = [[NSBundle mainBundle] pathForResource:@"alarm" ofType:@"mp3"]; 
NSError *error; 
alarmSound = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:pathToMusicFile1] error:&error]; 
NSLog(@"Song1 Loaded"); 
if (alarmSound == nil) { 
    NSLog(@"Error playing sound"); 
} else { 
    alarmSound.numberOfLoops = 20; 
    alarmSound.volume = 1.0; 
    [alarmSound play]; 
} 

ho tutto dichiarato correttamente (intestazioni e quadri ecc) che posso sentire il suono nel simulatore.

ho anche verificato che il mio telefono non è in modalità silenziosa !! Sento altri suoni dalla generica interfaccia grafica di iPhone. (esempio da un datepicker).

ho anche ripulito tutti gli obiettivi e cancellato l'applicazione per reinstallare.

Qualche idea cosa c'è che non va ?!

risposta

1

Hai provato [NSURL URLWithString:pathToMusicFile1]; invece di fileURLWithPath:?

49

Così, ho avuto questo problema troppo - Beh, io sono abbastanza sicuro che sia lo stesso ...

Abbiamo avuto un app in App Store per un anno o giù di lì ora e di recente abbiamo avuto bisogno di cambia un po 'di contenuto anche se nulla di funzionale.

Improvvisamente, il suono ha smesso di funzionare - Sia il simulatore nella sua ultima versione SDK (versione 4.0) e sul dispositivo di troppo (ancora una volta con iOS 4).

Il codice che ha sempre lavorato per noi era questo ...

NSString *sound_file; 
if ((sound_file = [[NSBundle mainBundle] pathForResource:@"track1" ofType:@"mp3"])){ 

NSURL *url = [[NSURL alloc] initFileURLWithPath:sound_file]; 
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:NULL]; 
audioPlayer.delegate = self; 
[url release]; 

[audioPlayer prepareToPlay]; 
[audioPlayer play]; 

} 

Infine, ho scoperto che è ora necessario impostare il tipo di riproduzione AVAudioSession solo per ottenere suono da riprodurre attraverso l'altoparlante come già fatto! Mettere seguente riga di codice nella vostra applicazione gestore di eventi delegato applicationDidFinishLaunching ...

- (void)applicationDidFinishLaunching:(UIApplication *)application { 

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 

Senza dimenticare di aggiungere il includere nella vostra app delegato .h di file (ovviamente è necessario importare quadro AVFoundation anche se non già fatto) ...

#import <AVFoundation/AVAudioSession.h> 

Speriamo che questo consenta di riprodurre l'audio sul dispositivo.

non ottengono cuaght da quello che penso potrebbe essere una questione a parte, e che è il suono ancora non gioca nel simulatore. Ho visto altri post che suggeriscono questo, ma non sono sicuro di quanto sia diffuso. Ho scoperto che se avessi selezionato iPad 3.2 come mio simulatore, almeno ci avrebbe lavorato. La gioia!

Quello che mi sembra pazzesco è che, sicuramente, questo deve comportare un sacco di persone e tuttavia è piuttosto difficile trovare informazioni o suggerimenti su qualcosa che dovrebbe essere un problema abbastanza noto - dopo tutto, ho visto un sacco di post su forum a cui non sembra sia stata data risposta.

Anywayz, spero che questo aiuti qualcun altro.

+0

wow questo 1 ha funzionato per me, stavo affrontando lo stesso problema, grazie @ Jon Andrews! – Dhawal

+4

Il codice '[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];' semplicemente sovrascrive lo switch silenzioso e consente di riprodurre i suoni quando il telefono è bloccato AFAIK. – evilgoldfish

+0

Finalmente! Ci è voluta un'ora di googling, conversione, importazione, prova e questo ha funzionato alla fine. Molte grazie! – karpathy

17

Il mio problema era che iOS è stato autoreleasing mio esempio AVAudioPlayer prima che il file ha la possibilità di giocare. Stranamente questo è successo solo con file MP3 e non AU. La soluzione era di non impostarla come autorelease e quindi rilasciarla nel metodo delegato ...

- (void)playSound:(NSString *)sound 
{ 
    AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:sound ofType:@""]] error:NULL]; 
    audioPlayer.delegate = self; 
    [audioPlayer play]; 
} 

... poi nel metodo delegato ...

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 
{ 
    [player release]; 
} 

... grandi opere ora.

+19

ARC stava rilasciando il giocatore prima che suonasse. Impostare il giocatore come una proprietà ha risolto questo per me. – Andy

+1

ARC stava causando la stessa cosa anche per me, e facendone una proprietà l'ha risolto. Ciao Andy. – AndyDunn

+0

Ho visto lo stesso problema e questo è stato efficace. – Halle

25

È estremamente importante avere la variabile "audioPlayer" come proprietà. Altrimenti con ARC, viene rilasciato prima che abbia la possibilità di giocare!

Mi ci è voluta mezz'ora e un po 'di googling per questo momento degli A-ha.

Il mio suono funziona perfettamente ora!

+4

Dopo un'intera ora di head-banging, ho finalmente trovato questo post. Grazie. –

+0

Che ne dici di suonare in un altro thread? – AVEbrahimi

+0

fantastico! Hai reso la mia giornata! :) –