2016-03-15 255 views
1

這些簡單的代碼行(在應用程序中沒有任何其他內容)可以在iOS 9(iPhone 6和iPhone 4S)上正常工作,但不適用於iOS 8(iPhone 5和iPod Touch 5G):VTCompressionSessionCreate適用於iOS 9,但不適用於iOS 8

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和與錯誤-12902(kVTParameterErr)無法在iOS 8的所有情況。很高興知道某些參數是錯誤的,但哪一個爲什麼在iOS 9上不被認爲是錯誤的?

請注意,VTCopyVideoEncoderList給我一個列表,其中avc1(H264)編碼器也存在於所有情況下。

任何想法是怎麼回事?

回答

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只有availabel從iOS 9開始:

__OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_9_0)

+0

好點,感謝提到這一點。我最終在蘋果公司打開了一個支持請求,他回答說,我的一小部分代碼在iOS 8上確實不起作用,並且沒有解決方法。他們沒有提到使用VTCompressionOutputCallback。 –

+0

這很奇怪,因爲有明顯的記錄解決方法。我在'iOS 8'上使用'VTCompressionSessionCreate'和一個基於C的'VTCompressionOutputCallback'回調函數,效果很好。 –

相關問題