Ho creato un codice per elaborare i file video su OSX, fotogramma per fotogramma. Quello che segue è un estratto dal codice che costruisce OK, apre il file, individua la traccia video (solo traccia) e inizia a leggere CMSampleBuffers senza problemi. Tuttavia, ogni CMSampleBufferRef I restituisce restituisce NULL quando provo ad estrarre il frame del buffer dei pixel. Non c'è alcuna indicazione nella documentazione di iOS sul motivo per cui potrei aspettarmi un valore di ritorno NULL o come potrei aspettarmi di risolvere il problema. Succede con tutti i video su cui l'ho testato, a prescindere dalla fonte di acquisizione o CODEC.Perché CMSampleBufferGetImageBuffer restituisce NULL
Qualsiasi aiuto molto apprezzato.
NSString *assetInPath = @"/Users/Dave/Movies/movie.mp4";
NSURL *assetInUrl = [NSURL fileURLWithPath:assetInPath];
AVAsset *assetIn = [AVAsset assetWithURL:assetInUrl];
NSError *error;
AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:assetIn error:&error];
AVAssetTrack *track = [assetIn.tracks objectAtIndex:0];
AVAssetReaderOutput *assetReaderOutput = [[AVAssetReaderTrackOutput alloc]
initWithTrack:track
outputSettings:nil];
[assetReader addOutput:assetReaderOutput];
// Start reading
[assetReader startReading];
CMSampleBufferRef sampleBuffer;
do {
sampleBuffer = [assetReaderOutput copyNextSampleBuffer];
/**
** At this point, sampleBuffer is non-null, has all appropriate attributes to indicate that
** it's a video frame, 320x240 or whatever and looks perfectly fine. But the next
** line always returns NULL without logging any obvious error message
**/
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
if(pixelBuffer != NULL) {
size_t width = CVPixelBufferGetWidth(pixelBuffer);
size_t height = CVPixelBufferGetHeight(pixelBuffer);
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
...
other processing removed here for clarity
}
} while(...);
Per essere chiari, ho messo a nudo tutti gli errori controllando il codice ma senza problemi stessero indicato in tale codice. cioè l'AVAssetReader sta leggendo, CMSampleBufferRef guarda bene ecc
Grazie! Fuori di interesse, dove hai trovato quella citazione? Perché qui: https://developer.apple.com/library/mac/#documentation/CoreMedia/Reference/CMSampleBuffer/Reference/Reference.html e nei documenti downlaoded nella mia versione XCode non c'è assolutamente alcun commento! –
Nei file di intestazione. Apple ha un documento molto detailef per ogni metodo.In xcode, fai clic con il pulsante destro del mouse sul nome del metodo nel tuo codice e fai clic su "vai alla definizione" (il testo potrebbe non essere esatto) e ti porterà al file .h corretto e alla definizione del metodo con la documentazione – Aki
Doh! Immagino di aver pensato che dal momento che i documenti non erano nella documentazione generata, non erano nella fonte. Grazie ancora Aki. –