2015-10-29 1 views
3

Я пытаюсь кодировать некоторый поток только видео, используя H264, и я готов использовать аппаратный кодер, чтобы сравнить как качество, так и расход ресурсов между оборудованием и Кодирование процессора. Дело в том, что я не могу заставить ОС использовать аппаратный кодер.Как отлаживать, почему Mac OS не использует аппаратное обеспечение Кодировщик H264

Это код, я использую для создания VTCompressionSession:

var status: OSStatus 

let encoderSpecifications: CFDictionary? = [ 
    kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder as String: true, 
    kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder as String: true, 
    kVTVideoEncoderSpecification_EncoderID as String: "com.apple.videotoolbox.videoencoder.24rgb" // Tried without this paramenter so the system can decide what encoder ID should be using but doesn't work anyway. 
] 

let pixelBufferOptions: CFDictionary? = [ 
    kCVPixelBufferWidthKey as String: Int(width), 
    kCVPixelBufferHeightKey as String: Int(height), 
    kCVPixelBufferPixelFormatTypeKey as String: Int(kCVPixelFormatType_24RGB) // Tried commenting this in case that there was a pixelformat constraint but didn't change anything 
]; 

status = VTCompressionSessionCreate(kCFAllocatorDefault, width, height, CMVideoCodecType(kCMVideoCodecType_H264), encoderSpecifications, pixelBufferOptions, nil, { (outputCallbackRefCon: UnsafeMutablePointer<Void>, sourceFrameRefCon: UnsafeMutablePointer<Void>, status: OSStatus, infoFlags: VTEncodeInfoFlags, sampleBuffer: CMSampleBuffer?) -> Void in 
    ... 
}, unsafeBitCast(self, UnsafeMutablePointer<Void>.self), &compressionSession) 

Я открыл консоль и это единственное соответствующее сообщение я получаю, когда я пытаюсь создать сеанс:

10/28/15 22:06:27.711 Dupla-Mac[87762]: <<<<VTVideoEncoderSelection>>>> VTSelectAndCreateVideoEncoderInstanceInternal: no video encoder found for 'avc1' 

Это код состояния я получаю, когда я использую EncoderID:

2015-10-28 22:17:13.480 Dupla-Mac[87895:5578917] Couldn't create compression session :(-12908 

И это один я получаю, когда я не использую EncoderID:

2015-10-28 22:18:16.695 Dupla-Mac[87996:5581914] Couldn't create compression session :(-12915 

Оба связаны с отсутствием доступности ресурса, но не смог найти никакой разницы. Я проверил, что наиболее известные функции, которые могут использовать аппаратный кодер, отключены, но я не знаю, как это проверить. AirPlay выключен, QuickTime выключен, нет доступа к камере, и поэтому.

TL; DR: есть ли способ заставить или знать, что стратегия ОС используется для включения аппаратного кодировщика, и в конечном итоге знать почему он не доступен в любой момент?

Заранее благодарен!

ответ

1

Я думаю, вы уже решили проблему, но для других - единственный HW-ускоренный кодировщик, доступный на macOS (10.8-10.12 для всех macs 2012+)/iOS (8-10) - это com.apple.videotoolbox.videoencoder.h264.gva и здесь полный список: https://gist.github.com/vade/06ace2e33561a79cc240

0

получить список кодеков

CFArrayRef encoder_list; 
    VTCopyVideoEncoderList(NULL, &encoder_list); 
    CFIndex size = CFArrayGetCount(encoder_list); 
    for(CFIndex i = 0; i < size; i++) { 
     CFDictionaryRef encoder_dict = CFArrayGetValueAtIndex(encoder_list, i); 
     CFStringRef type = CFDictionaryGetValue(encoder_dict, kVTVideoEncoderList_CodecType); 
     CFStringRef encoderID = CFDictionaryGetValue(encoder_dict, kVTVideoEncoderList_EncoderID); 
     CFStringRef codecName = CFDictionaryGetValue(encoder_dict, kVTVideoEncoderList_CodecName); 
     CFStringRef encoderName = CFDictionaryGetValue(encoder_dict, kVTVideoEncoderList_EncoderName); 
     CFStringRef display_name = CFDictionaryGetValue(encoder_dict, kVTVideoEncoderList_DisplayName); 
     NSLog(@" %@ %@ %@ %@ %@", type, encoderID, codecName, encoderName, display_name); 
    }