• iOS 影音新格式 HEIF HEVC


    苹果在 iOS 11 的发布会上,推出了两种新的媒体格式 HEIF HEVC,都是为了保证画质的情况下,大大减少视频、照片的大小。

    一、简介

    HEVC全称 High Efficiency Video Coding(高效率视频编码),是比H.264更加优秀的一种视频压缩标准(也称为 H.265)。HEVC 在低码率视频压缩上,提升质量、减少容量和节省带宽方面都有突出表现,因此除了拍摄占用的容量减少外,在视频通话时也能更加流畅清晰。

    HEIF: 高效率图像文件格式(英语:High Efficiency Image File Format, HEIF;也称高效图像文件格式)是一个用于单张图像或图像序列的文件格式。它由运动图像专家组(MPEG)开发,并在MPEG-H Part 12(ISO/IEC 23008-12)中定义。用于HEVC关键帧的处理上,因此它同样可以用更少的容量来存储画质更好的照片,在连拍、动图和色彩变化不大的照片上效果尤其明显。

    HEIF规范也定义了高效率视频编码(HEVC)编码的内嵌图像和HEVC编码的图像序列的存储方式,其中以受约束的方式应用帧间预测。

    HEIF文件与ISO基本媒体文件格式(ISOBMFF,ISO/IEC 14496-12)兼容,并且还可以包括其他媒体流,例如定时的文本和音频。

    HEIF 文件可以包含 GIF 动图、HDR 相片、连拍、Live Photo。

    HEIF扩展名:.heif、.heic。
    互联网媒体类型:image/heif、image/heic、image/heif-sequence、image/

    二、对代码的影响

    1. 识别HEIF

      识别HEIF文件的方法和识别GIF一样,对比文件UTI(uniformTypeIdentifier)

      - (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 会显示原始的编码格式。

    三、编码转换

    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

  • 相关阅读:
    LifeRay学习记录
    jQuery选择器
    JavaScript中for..in循环陷阱
    Python课程回顾(day18)
    Python课程回顾(day17)
    Python课程回顾(day15)
    Python课程回顾(day14)
    Python课程回顾(day13)
    Python课程回顾(day12)
    Python课程回顾(day11)
  • 原文地址:https://www.cnblogs.com/v2m_/p/7904737.html
Copyright © 2020-2023  润新知