2011-11-29 15 views
12

próbuję wstawić AVURLAsset z AVPlayerItem który stwierdza AVPlayerItemStatusReadyToPlay się z AVMutableComposition jak ten:Wkładanie strumienia HTTP do AVMutableComposition

composition_ = [[AVMutableComposition alloc] init]; 
insertionPoint_ = kCMTimeZero; 
item_ = [[AVPlayerItem playerItemWithURL:[NSURL URLWithString:@"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"]] retain]; 
[item_ addObserver:self forKeyPath:@"status" options:0 context:nil]; 
player_ = [[AVPlayer playerWithPlayerItem:item_] retain]; 
[player_ addObserver:self forKeyPath:@"currentItem.duration" options:0 context:nil]; 


/** 
* append a player-item to our composition 
*/ 
- (void)addItemToComposition:(AVPlayerItem *)item 
{ 
    NSError *error = nil; 
    VTRACE(@"item duration: %g", CMTimeGetSeconds(item.duration)); 
    if (![composition_ insertTimeRange:CMTimeRangeMake(kCMTimeZero, item.duration) 
           ofAsset:item.asset 
           atTime:insertionPoint_ 
           error:&error]) 
    { 
     VTRACE(@"error: %@", error); 
    } 
} 

/** 
* simplified value observer callback 
*/ 
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if ([object isKindOfClass:[AVPlayerItem class]]) 
    { 
     AVPlayerItem *item = (AVPlayerItem *)object; 
     //playerItem status value changed? 
     if ([keyPath isEqualToString:@"status"]) 
     { //yes-> 
      switch(item.status) 
      { 
       case AVPlayerItemStatusFailed: 
        VTRACE(@"player item status failed"); 
       break; 
       case AVPlayerItemStatusReadyToPlay: 
        VTRACE(@"player item status is ready to play"); 
        [self addItemToComposition:player_.currentItem]; 
       break; 
       case AVPlayerItemStatusUnknown: 
        VTRACE(@"player item status is unknown"); 
       break; 
      } 
     } 
    } 
    else if([object isKindOfClass:[AVPlayer class]]) 
    { 
     if ([keyPath isEqualToString:@"currentItem.duration"]) 
     { //yes-> 
      VTRACE(@"player item duration available"); 
     } 
    } 
} 

Niestety, wszystko co dostaje jest to kiepska wiadomość o błędzie z próbą wywołaj AVMutableComposition insertTimeRange:ofAsset:atTime:error:

2011-11-29 22:24:59.446 XXX[13626:10703] -[XXX addItemToComposition:] -- error: Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo=0x7699f30 {NSLocalizedFailureReason=An unknown error occurred (-12780), NSUnderlyingError=0xd124dd0 "The operation couldn’t be completed. (OSStatus error -12780.)", NSLocalizedDescription=The operation could not be completed}

Czego mi brakuje?

Dlaczego nie można wstawić przedmiotu do kompozycji?

Podczas sprawdzania AVURLAsset tego AVPlayerItem zauważyłem również, że tablica ścieżek jest przydzielona, ​​ale pusta. Czy to może być powód, a jeśli tak, to w jaki sposób uzyskać AVURLAsset, aby poprawnie trzymać prawidłowe ścieżki?

Odpowiedz

11

Dobrze, dostałem odpowiedź z innego źródła i nie podoba mi się to ...

To widocznie możliwe tylko wstawić lokalne elementy (aktywa) w jego AVMutableComposition, odległe przedmioty (jak strumienie wideo HTTP) nie będzie działać.

Fakt, że dokumentacja nie mówi tego i fakt, że komunikat o błędzie, który otrzymuję, jest bezużyteczny, wydaje się być zaniechaniem firmy Apple. Złożyłem raport o błędzie, aby poprawić tę sytuację.

Jabłko Radar Bug Id: 10517711

Open Radar bug report.

+1

Status raportu jest nadal "Otwarty", od 2011 –

Powiązane problemy