VTCompressionSessionCreate 适用于 iOS 9 但不适用于 iOS 8

VTCompressionSessionCreate works on iOS 9 but not on iOS 8

这些简单的代码行(应用程序中没有其他任何内容)在 iOS 9(iPhone 6 和 iPhone 4S)上运行良好,但在 iOS 8(iPhone 5 和 iPod Touch 5G):

VTCompressionSessionRef videoEncoder;
OSStatus err = VTCompressionSessionCreate(NULL, 1920, 1080,
                                          kCMVideoCodecType_H264, 
                                          NULL, 
                                          NULL, 
                                          NULL, 
                                          NULL, 
                                          (__bridge void*)self, &videoEncoder);
if (err != noErr) {
    NSLog(@"Error when creating compression session : %d", (int)err);
} else {
    NSLog(@"All systems go!");
}

我也尝试过使用较低的分辨率,尝试提供部分或全部可选参数,在所有情况下它都适用于 iOS 9 而在 iOS 8 上失败并出现错误 -12902 ( kVTParameterErr)。很高兴知道某些参数是错误的,但是哪个参数以及为什么它在 iOS 9 上不被认为是错误的?

请注意,VTCopyVideoEncoderList 确实为我提供了一个列表,其中在所有情况下都存在 avc1 (H264) 编码器。

知道发生了什么事吗?

答案有点晚了,但我想它可能对其他人有用。对于 iOS 8,您应该在创建压缩会话时指定 VTCompressionOutputCallback outputCallback。来自文档:

@param  outputCallback
    The callback to be called with compressed frames.
    This function may be called asynchronously, on a different thread from the one that calls VTCompressionSessionEncodeFrame.
    Pass NULL if and only if you will be calling VTCompressionSessionEncodeFrameWithOutputHandler for encoding frames.

反过来,VTCompressionSessionEncodeFrameWithOutputHandler 仅从 iOS 9 开始可用:

__OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_9_0)