1

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

知道发生了什么吗?

4

1 回答 1

1

答案有点晚了,但我想它可能对其他人有用。因为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)

于 2017-03-20T07:24:44.353 回答