2015-09-02 9 views
1

У меня есть функция, которая принимает CVImageBufferRef и передает ее моей VTCompressionSession для обработки.Код ошибки VTCompressionSessionEncodeFrame -12902

Запуск VTCompressionSession и мой вызов для VTCompressionSessionCreate успешно завершен.

Я извлечения видео URL из библиотеки фотографий и ее обработки с помощью следующих действий:

- (void)processImageBuffersFromURL:(NSURL *)url withBlock:(void (^)(CVImageBufferRef bufferRef))block { 
    AVAsset *asset = [AVAsset assetWithURL:url]; 
    AVAssetTrack *track = [[asset 
          tracksWithMediaType:AVMediaTypeVideo] 
          objectAtIndex:0]; 

    AVAssetReaderTrackOutput 
    *readerTrack = [AVAssetReaderTrackOutput 
        assetReaderTrackOutputWithTrack:track 
        outputSettings:@{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange)}]; 
    AVAssetReader *reader = [AVAssetReader assetReaderWithAsset:asset 
                  error:nil]; 
    [reader addOutput:readerTrack]; 
    [reader startReading]; 

    CMSampleBufferRef sample = NULL; 

    while ((sample = [readerTrack copyNextSampleBuffer])) { 
     CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sample); 
     block(imageBuffer); 
    } 
} 

блок в основном только вызывает

SInt32 status = VTCompressionSessionEncodeFrame(_compressionSession, imageBuffer, CMTimeMake(self.currentFrameNumber++, 30), kCMTimeInvalid, NULL, (__bridge void *)self, NULL); 

и статус -12902. Я просмотрел this site для получения информации о статусе, и я не могу найти другую релевантную информацию. Сайт говорит, что ошибка kVTParameterErr.

My VTCompressionOutputCallback не вызывается.

Может кто-нибудь объяснить этот код ошибки для меня?

ответ

0

Получается, что мой _compressionSession был NULL, следовательно, kVTParameterErr.

Breaking on VTCompressionSessionEncodeFrame поможет определить, какой параметр является неправильным, и документы указывают вам, какие параметры могут быть NULL (почти все, кроме буфера сеанса и изображения).

В моем конкретном случае я случайно использовал метод VTCompressionSessionCreate в методе класса вместо метода экземпляра, поэтому экземпляр, который я отправлял imageBuffer, не имел собственной сессии сжатия.