Ich habe Code erstellt, um Videodateien unter OSX Frame für Frame zu verarbeiten. Das Folgende ist ein Auszug aus dem Code, der OK baut, die Datei öffnet, die Videospur (nur Spur) lokalisiert und CMSampleBuffers ohne Probleme zu lesen beginnt. Jedoch gibt jedes CMSampleBufferRef I erhalten NULL zurück, wenn ich versuche, den Pixelpufferrahmen zu extrahieren. In der iOS-Dokumentation gibt es keine Hinweise darauf, warum ich einen NULL-Rückgabewert erwarten könnte oder wie ich das Problem beheben könnte. Es passiert mit allen Videos, auf denen ich es getestet habe, unabhängig von der Aufnahmequelle oder CODEC.Warum gibt CMSampleBufferGetImageBuffer NULL zurück
Jede Hilfe sehr geschätzt.
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(...);
Um klar zu sein, habe ich alle Fehler Prüfcode entfernt, aber keine Probleme wurden in diesem Code angezeigt. dh die AVAssetReader liest, sieht CMSampleBufferRef fein usw.
Danke! Aus Interesse, wo haben Sie dieses Zitat gefunden? Denn hier: https://developer.apple.com/library/mac/#documentation/CoreMedia/Reference/CMSampleBuffer/Reference/Reference.html und in den in meiner XCode-Version herunterladbaren Dokumenten gibt es überhaupt keine Kommentare! –
In den Header-Dateien. Apple hat eine sehr detaillierte Dokumentation für jede Methode.Klicken Sie in xcode mit der rechten Maustaste auf den Methodennamen in Ihrem Code und klicken Sie auf "Gehe zur Definition" (Der Wortlaut ist möglicherweise nicht exakt), und Sie gelangen zur richtigen .h-Datei und Methodendefinition mit Dokumentation – Aki
Doh! Ich nehme an, dass, da die Dokumente nicht in der generierten Dokumentation waren, sie nicht in der Quelle waren. Danke nochmal Aki. –