2012-05-16 11 views
6

Mam problem z odtwarzaniem lokalnego pliku .wav. Mój AVPlayerStatus drukuje 0, co zakładam, że nie jest gotowy do gry. Nie mogę tego zrozumieć, ale powiedziawszy to, po raz pierwszy próbuję użyć cokolwiek wspólnego z AVPlayerem, więc prawdopodobnie jest to coś prostego. Byłbym wdzięczny za każdą pomoc. Oto kod:AVPlayerStatus dla pliku lokalnego niegotowy

Muszę dodać, że moje dźwięki nie grają!

-(void) playWordSound:(UILabel *)label 
{ 
    NSString *path; 
    switch (label.tag) 
    { 
     case 1: 
      path = [[NSBundle mainBundle] pathForResource:@"humpty" ofType:@"wav"]; 
      break; 
     case 2: 
      path = [[NSBundle mainBundle] pathForResource:@"dumpty" ofType:@"wav"]; 
      break; 
     case 3: 
      path = [[NSBundle mainBundle] pathForResource:@"saty" ofType:@"wav"]; 
      break; 
     case 4: 
      path = [[NSBundle mainBundle] pathForResource:@"on 2" ofType:@"wav"]; 
      break; 
     case 5: 
      path = [[NSBundle mainBundle] pathForResource:@"a 3" ofType:@"wav"]; 
      break; 
     case 6: 
      path = [[NSBundle mainBundle] pathForResource:@"wall" ofType:@"wav"]; 
      break; 
    } 
    NSURL *url = [NSURL fileURLWithPath:path]; 
    AVQueuePlayer *player; 
    static const NSString *ItemStatusContext; 
    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:url]; 
    [playerItem addObserver:self forKeyPath:@"status" options:0 context:&ItemStatusContext]; 
    player = [AVPlayer playerWithPlayerItem:playerItem]; 

    NSLog(@"%d",player.status); 
    [player play]; 
} 

- (void)playerItemDidReachEnd:(NSNotification *)notification { 
    NSLog(@"Sound finished"); 
} 

Odpowiedz

11

Oto kilka ważnych pułapek Apple wskazujące podczas korzystania AVPlayItem -initWithURL: metodę:

Rozważania specjalne

Metoda ta natychmiast zwraca pozycję, ale ze statusem AVPlayerItemStatusUnknown.

Jeśli URL zawiera poprawne dane, które mogą być użyte przez element odtwarzacza, , status później zmieni się na AVPlayerItemStatusReadyToPlay.

Jeśli URL nie zawiera ważnych danych lub w inny sposób nie może być użyty przez element odtwarzacza , status później zmienia się na AVPlayerItemStatusFailed.

Co mogę sobie wyobrazić dzieje się to, bo wysyłasz wiadomość -play niedługo po utworzeniu obiektu AVPlayerItem, jego stan jest nadal AVPlayerItemStatusUnknown (to samo dotyczy obiektu AVPlayer), ponieważ nie otrzymują wystarczająco dużo czasu, aby załadować zasób i zmienić status na AVPlayerItemStatusReadyToPlay.

Moje sugestie:

  • Albo sprawdzić zmiany stanu AVPlayerItem/AVPlayer i nazywają -play na późniejszym etapie;

albo jeszcze prościej,

  • Załaduj AVAsset lub AVURLAsset obiekt od bibliotece NSURL i użyć metody AVPlayerItem –initWithAsset:, który powinien zwrócić gotowy do gry obiektu, a następnie zadzwoń -play natychmiast po, jeśli tak, proszę.
+0

Inicjowanie jako AVAsset to naprawił! Dziękuję bardzo za Twoją pomoc! –

+0

Cieszę się, że mogę pomóc. Twoje zdrowie! – MiguelB

1

0 jest równoważna AVPlayerStatusUnknown, zakładam, że to dlatego, że gracz nie próbuje załadować URL aż faktycznie nazwać play.

Z documentation:

AVPlayerStatusUnknown

Wskazuje, że stan odtwarzacza nie jest jeszcze znana, ponieważ nie próbował załadować nowe zasoby multimedialne do odtwarzania.

+0

Przełączyłem kod tak, że '[player play]' jest wywoływane przed 'player.status' i nadal wysyła' 0'. Powinienem wspomnieć odważnie gdzieś w moim oryginalnym poście, że prawdziwym problemem jest to, że dźwięki nie grają! – garethdn

Powiązane problemy