2011-07-23 1 views
1

Je suis en train de convertir un film H.264 QuickTime en une texture OpenGL sur iOS. Je suis coincé décodage des tampons de trame du fichier d'entrée. Un cadre décode correctement et affiche. Tous les appels suivants à [AVAssetReaderTrackOutput getNextSample] renvoient NULL, cependant, et AVAssetReader.status == AVAssetReaderStatusFailed. Si je ne spécifie pas de valeur pour kCVPixelBufferPixelFormatTypeKey dans les paramètres dict, l'état reste AVAssetReaderStatusReading, mais les objets de la mémoire tampon retournés sont vides. L'AVAsset en question joue sans problème dans AVPlayer. Y at-il quelque chose qui ne va pas avec mon code?AVAssetReader échoue après une image sur le fichier .mov H.264

- (id) initWithAsset: (AVAsset *) asset { 
    if (!(self = [super init])) return nil; 
    _asset = [asset copy]; 
    [self initReaderToTime:kCMTimeZero]; 
    return self; 
} 

- (void) initReaderToTime:(CMTime) readStartTime { 
    _readStartTime = readStartTime; 

    NSMutableDictionary *outputSettings = [NSMutableDictionary dictionary]; 
    [outputSettings setObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(NSString *)kCVPixelBufferPixelFormatTypeKey]; 
    _trackOutput = [[AVAssetReaderTrackOutput alloc] initWithTrack:[[_asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] outputSettings:outputSettings]; 

    NSError *error = nil; 
    _assetReader = [[AVAssetReader alloc] initWithAsset:_asset error:&error]; 
    if (error) return; 

    if (![_assetReader canAddOutput:_trackOutput]) return; 
    [_assetReader addOutput:_trackOutput]; 

    if (![_assetReader startReading]) return; 

    [self getNextSample]; 
} 


- (void) getNextSample { 
    if (_assetReader.status != AVAssetReaderStatusReading) { 
     Log(@"Reader status %d != AVAssetReaderStatusReading. Ending...", _assetReader.status); 
     return; 
    } 

    CMSampleBufferRef sampleBuffer = [_trackOutput copyNextSampleBuffer]; 

    /* 
    Do things with buffer 
    */ 

    [self performSelector:_cmd withObject:nil afterDelay:0]; 

} 

Répondre

0

[_trackOutput copyNextSampleBuffer] doit apparaître quelque part dans votre code.

+0

Désolé, c'est le cas. J'ai enlevé cela en supprimant le code non lié pour ce post. Modification maintenant Le comportement étrange est que le premier appel à copyNextSampleBuffer retourner un tampon d'échantillon valide (que j'affichage à l'écran avec succès. Tous les appels ultérieurs à copyNextSampleBuffer return null. – wombat57

+0

Avez-vous mis en place une session audio avec une catégorie POLYVALENT? –

+0

OK, la Le problème est que j'essaie de lire un fichier audio avec AVPlayer pendant que je rends la vidéo.Si je ne démarre pas AVPlayer, AVAssetReader fonctionne.Il semble qu'ils partagent un état global! (Peut-être qu'ils verrouillent tous deux le matériel de décodage.) Dans tous les cas, – wombat57