1

我有一个函数,它接受一个 CVImageBufferRef 并将其传递给我的 VTCompressionSession 进行处理。

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。我在此站点上查看了有关状态的信息,但找不到任何其他相关信息。该网站说错误是kVTParameterErr.

我的 VTCompressionOutputCallback 没有被调用。

谁能向我解释这个错误代码?

4

1 回答 1

0

原来我的 _compressionSession 是 NULL,因此是 kVTParameterErr。

打破 VTCompressionSessionEncodeFrame 将有助于找出哪个参数不正确,并且文档告诉您哪些参数可以为 NULL(几乎除了会话和图像缓冲区之外的所有参数)。

对于我的特殊情况,我不小心在类方法而不是实例方法中使用了 VTCompressionSessionCreate,因此我发送 imageBuffer 的实例没有自己的压缩会话。

于 2015-09-08T20:20:55.203 回答