Search code examples
swiftencodecodechevch.265

Determine if iOS device can support HEVC encoding


My problem is I want to use AVVideoCodecHEVC. I know that it's only available in iOS 11, but device's without the A10 chip do not support it.

So, using if #available(iOS 11.0, *) { let self.codec = AVVideoCodecHEVC } Will throw Cannot Encode error if using a device like an iPhone 6 that doesn't have the A10 chip. Has anyone been able to figure out if a device running iOS 11, can support HEVC?


Solution

  • You can check if an iOS device or Mac has hardware encoding support using VideoToolbox:

    /// Whether or not the current device has an HEVC hardware encoder.
    public static let hasHEVCHardwareEncoder: Bool = {
        let spec: [CFString: Any]
        #if os(macOS)
            spec = [ kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder: true ]
        #else
            spec = [:]
        #endif
        var outID: CFString?
        var properties: CFDictionary?
        let result = VTCopySupportedPropertyDictionaryForEncoder(width: 1920, height: 1080, codecType: kCMVideoCodecType_HEVC, encoderSpecification: spec as CFDictionary, encoderIDOut: &outID, supportedPropertiesOut: &properties)
        if result == kVTCouldNotFindVideoEncoderErr {
            return false // no hardware HEVC encoder
        }
        return result == noErr
    }()
    

    A much higher level way to check is to see if AVAssetExportSession supports one of the HEVC presets:

    AVAssetExportSession.allExportPresets().contains(AVAssetExportPresetHEVCHighestQuality)
    

    See “Working with HEIF and HEVC” from WWDC 2017 for more info.