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)
这些简单的代码行(应用程序中没有其他任何内容)在 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)