VTCompressionSessionEncodeFrame 错误代码 -12902
VTCompressionSessionEncodeFrame error code -12902
我有一个函数接受 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。我在 this site 上查看了有关状态的信息,但找不到任何其他相关信息。该网站说错误是 kVTParameterErr
.
我的 VTCompressionOutputCallback 没有被调用。
任何人都可以向我解释这个错误代码吗?
原来我的 _compressionSession 是 NULL,因此是 kVTParameterErr。
打破 VTCompressionSessionEncodeFrame 将有助于找出哪个参数不正确,文档会告诉您哪些参数可以为 NULL(除了会话和图像缓冲区之外几乎所有参数)。
对于我的特殊情况,我不小心在 class 方法而不是实例方法中使用了 VTCompressionSessionCreate,因此我发送 imageBuffer 的实例没有自己的压缩会话。
我有一个函数接受 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。我在 this site 上查看了有关状态的信息,但找不到任何其他相关信息。该网站说错误是 kVTParameterErr
.
我的 VTCompressionOutputCallback 没有被调用。
任何人都可以向我解释这个错误代码吗?
原来我的 _compressionSession 是 NULL,因此是 kVTParameterErr。
打破 VTCompressionSessionEncodeFrame 将有助于找出哪个参数不正确,文档会告诉您哪些参数可以为 NULL(除了会话和图像缓冲区之外几乎所有参数)。
对于我的特殊情况,我不小心在 class 方法而不是实例方法中使用了 VTCompressionSessionCreate,因此我发送 imageBuffer 的实例没有自己的压缩会话。