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?
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.