2016-03-15 10 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!"); 
} 

Я также попытался с более низким разрешением, пытался предоставление некоторых или все необязательных параметров, во всех случаях он работает на прошивке 9 и терпит неудачу на прошивке 8 с ошибкой -12902 (kVTParameterErr). Приятно знать, что какой-то параметр неверен, но какой из них и почему он не считается ошибочным на 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

Хороший вопрос, спасибо за упоминания о нем. Я закончил тем, что открыл заявку на поддержку в Apple, который ответил, что мой код действительно не работает на iOS 8, и нет никакой работы. Они не упомянули об использовании VTCompressionOutputCallback. –

+0

Странно, потому что есть очевидное документированное обходное решение. Я использую 'VTCompressionSessionCreate' с обратным вызовом' VTCompressionOutputCallback' на основе C на 'iOS 8', и он отлично работает. –

 Смежные вопросы

  • Нет связанных вопросов^_^