2011-11-29 11 views
12

Sto cercando di inserire un AVURLAsset di un AVPlayerItem che indica AVPlayerItemStatusReadyToPlay in un AVMutableComposition come questo:Inserimento di un flusso HTTP in un 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"); 
     } 
    } 
} 

Purtroppo, tutto quello che ottiene è questo messaggio di errore schifoso dal tentativo di invoco 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}

che cosa mi manca?

Perché non è possibile inserire l'articolo nella composizione?

Durante l'ispezione deldi quello AVPlayerItem ho anche notato che l'array di tracce è assegnato ma vuoto. Potrebbe essere questa la ragione, e in tal caso, come faccio a ottenere il AVURLAsset per tenere correttamente tracce valide?

risposta

11

Bene, ho ottenuto una risposta da un'altra fonte e non mi piace ...

E 'evidentemente possibile solo inserire elementi locali (attività) in un AVMutableComposition, articoli a distanza (come flussi video HTTP) non funzionerà.

Il fatto che la documentazione non lo dica e il fatto che il messaggio di errore che sto ricevendo sia inutile sembra essere un'omissione di Apple. Ho archiviato un bug report per migliorare quella situazione.

di Apple Radar Bug Id: 10517711

Open Radar bug report.

+1

Lo stato del rapporto è ancora 'Aperto', dal 2011 –

Problemi correlati