Mam wbudowany kod do przetwarzania plików wideo na OSX, klatka po klatce. Poniżej znajduje się wyciąg z kodu, który buduje OK, otwiera plik, lokalizuje ścieżkę wideo (tylko ścieżkę) i rozpoczyna czytanie CMSampleBuffers bez problemu. Jednak każdy CMSampleBufferRef I uzyskać zwraca NULL, gdy próbuję wyodrębnić ramki bufora pikseli. W dokumentacji systemu iOS nie ma informacji, dlaczego mogłem oczekiwać wartości zwracanej wartości NULL lub w jaki sposób mogłem oczekiwać rozwiązania problemu. Dzieje się tak w przypadku wszystkich filmów, na których testowałem, niezależnie od źródła przechwytywania lub kodu CODEC.Dlaczego CMSampleBufferGetImageBuffer zwraca NULL
Każda pomoc bardzo ceniona.
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(...);
Dla jasności usunąłem cały kod sprawdzania błędów, ale w tym kodzie nie stwierdzono żadnych problemów. czyli AVAssetReader czyta CMSampleBufferRef wygląda dobrze itd
Dzięki! Ciekawe, gdzie znalazłeś ten cytat? Ponieważ tutaj: https://developer.apple.com/library/mac/#documentation/CoreMedia/Reference/CMSampleBuffer/Reference/Reference.html oraz w dokumentach skopiowanych w mojej wersji XCode nie ma absolutnie żadnego komentarza! –
W plikach nagłówkowych. Apple ma bardzo szczegółowe dokumenty dla każdej metody.W kodzie xcode kliknij prawym przyciskiem myszy nazwę metody w kodzie i kliknij "przejdź do definicji" (treść może nie być dokładna), a przeniesie Cię do poprawnej definicji pliku i metody .h wraz z dokumentacją – Aki
Doh! Sądzę, że założyłem, że skoro dokumenty nie znajdowały się w wygenerowanej dokumentacji, nie były one w źródle. Jeszcze raz dziękuję Aki. –