4

H264 を使用してビデオのみのストリームをエンコードしようとしています。ハードウェア エンコーダーを使用して、ハードウェアと CPU のエンコード間の品質とリソース消費の両方を比較したいと考えています。問題は、OS にハードウェア エンコーダーを強制的に使用させることができないということです。

これは、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: ハードウェア エンコーダーを有効にするために OS が使用している戦略を強制または知る方法はありますか?最終的には、いつでも使用できない理由を知ることができますか?

前もって感謝します!

4

2 に答える 2

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);
    }
于 2016-08-15T11:49:32.860 に答える