iOS 影音新格式 HEIF HEVC

蘋果在 iOS 11 的發佈會上,推出了兩種新的媒體格式 HEIF HEVC,都是爲了保證畫質的狀況下,大大減小視頻、照片的大小。html

1、簡介

HEVC全稱 High Efficiency Video Coding(高效率視頻編碼),是比H.264更加優秀的一種視頻壓縮標準(也稱爲 H.265)。HEVC 在低碼率視頻壓縮上,提高質量、減小容量和節省帶寬方面都有突出表現,所以除了拍攝佔用的容量減小外,在視頻通話時也能更加流暢清晰。git

HEIF: 高效率圖像文件格式(英語:High Efficiency Image File Format, HEIF;也稱高效圖像文件格式)是一個用於單張圖像或圖像序列的文件格式。它由運動圖像專家組(MPEG)開發,並在MPEG-H Part 12(ISO/IEC 23008-12)中定義。用於HEVC關鍵幀的處理上,所以它一樣能夠用更少的容量來存儲畫質更好的照片,在連拍、動圖和色彩變化不大的照片上效果尤爲明顯。github

HEIF規範也定義了高效率視頻編碼(HEVC)編碼的內嵌圖像和HEVC編碼的圖像序列的存儲方式,其中以受約束的方式應用幀間預測。ide

HEIF文件與ISO基本媒體文件格式(ISOBMFF,ISO/IEC 14496-12)兼容,而且還能夠包括其餘媒體流,例如定時的文本和音頻。ui

HEIF 文件能夠包含 GIF 動圖、HDR 相片、連拍、Live Photo。編碼

HEIF擴展名:.heif、.heic。
互聯網媒體類型:image/heif、image/heic、image/heif-sequence、image/atom

2、對代碼的影響

  1. 識別HEIFcode

    識別HEIF文件的方法和識別GIF同樣,對比文件UTI(uniformTypeIdentifier)orm

    - (BOOL)isHeif:(PHAsset *)asset
    {
        __block BOOL isHEIF = NO;
        NSArray *resourceList = [PHAssetResource assetResourcesForAsset:asset];
        [resourceList enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            PHAssetResource *resource = obj;
            NSString *UTI = resource.uniformTypeIdentifier;
            if ([UTI isEqualToString:AVFileTypeHEIF] || [UTI isEqualToString:AVFileTypeHEIC]) {
                isHEIF = YES;
                *stop = YES;
            }
        }];
        return isHEIF;
    }
  2. 檢測設備是否支持硬解碼 HEVC視頻

    VTIsHardwareDecodeSupported(kCMVideoCodecType_HEVC)

  3. 系統選圖對 HEIF 的支持

    UIImagePickerController  添加了一個枚舉類型:
    ```
    typedef enum UIImagePickerControllerImageURLExportPreset : NSInteger {
    UIImagePickerControllerImageURLExportPresetCompatible = 0,
    UIImagePickerControllerImageURLExportPresetCurrent
    } UIImagePickerControllerImageURLExportPreset;

    @property(nonatomic) UIImagePickerControllerImageURLExportPreset imageExportPreset NS_AVAILABLE_IOS(11_0); // default value is UIImagePickerControllerImageExportPresetCompatible.
    ```

其中,UIImagePickerControllerImageURLExportPresetCompatible會把 HEIF 格式轉成 JPEG。UIImagePickerControllerImageURLExportPresetCurrent 會顯示原始的編碼格式。

3、編碼轉換

  1. HEIF 格式轉 JPEG 格式

    [[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
            if ([dataUTI isEqualToString:AVFileTypeHEIF] || [dataUTI isEqualToString:AVFileTypeHEIC]) {
                CIImage *ciImage = [CIImage imageWithData:imageData];
                CIContext *context = [CIContext context];
                NSData *jpgData = [context JPEGRepresentationOfImage:ciImage colorSpace:ciImage.colorSpace options:@{}];
            } else {
            }
        }];
  2. JPEG 格式轉 HEIF 格式

    NSData * UIImageHEICRepresentation(UIImage *const image, const CGFloat compressionQuality)
    {
        NSData *imageData = nil;
        if (@available(iOS 11.0, *)) {
            if (image) {
                NSMutableData *destinationData = [NSMutableData new];
                CGImageDestinationRef destination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)destinationData, (__bridge CFStringRef)AVFileTypeHEIC, 1, NULL);
                if (destination) {
                    NSDictionary *options = @{(__bridge NSString *)kCGImageDestinationLossyCompressionQuality: @(compressionQuality)};
                    CGImageDestinationAddImage(destination, image.CGImage, (__bridge CFDictionaryRef)options);
                    CGImageDestinationFinalize(destination);
                    imageData = destinationData;
                    CFRelease(destination);
                } else {
    // 建立失敗,說明設備不支持 HEIF 寫入
                }
            }
        }
        return imageData;
    }

參考1.https://en.wikipedia.org/wiki/High_Efficiency_Image_File_Format
參考2.http://www.feng.com/iPhone/news/2017-06-19/Apple-USES-HEVC-and-HEIF-what-equipment-will-be-compatible_682999.shtml
參考3.http://www.jianshu.com/p/a63c7d5d98a9
參考4.https://github.com/timonus/UIImageHEIC

相關文章
相關標籤/搜索