苹果在 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)

    1. - (BOOL)isHeif:(PHAsset *)asset
    2. {
    3. __block BOOL isHEIF = NO;
    4. NSArray *resourceList = [PHAssetResource assetResourcesForAsset:asset];
    5. [resourceList enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    6. PHAssetResource *resource = obj;
    7. NSString *UTI = resource.uniformTypeIdentifier;
    8. if ([UTI isEqualToString:AVFileTypeHEIF] || [UTI isEqualToString:AVFileTypeHEIC]) {
    9. isHEIF = YES;
    10. *stop = YES;
    11. }
    12. }];
    13. return isHEIF;
    14. }
  2. 检测设备是否支持硬解码 HEVC

    VTIsHardwareDecodeSupported(kCMVideoCodecType_HEVC)

  3. 系统选图对 HEIF 的支持

    UIImagePickerController  添加了一个枚举类型:

    1. typedef enum UIImagePickerControllerImageURLExportPreset : NSInteger {
    2. UIImagePickerControllerImageURLExportPresetCompatible = 0,
    3. UIImagePickerControllerImageURLExportPresetCurrent
    4. } UIImagePickerControllerImageURLExportPreset;
    5. @property(nonatomic) UIImagePickerControllerImageURLExportPreset imageExportPreset NS_AVAILABLE_IOS(11_0); // default value is UIImagePickerControllerImageExportPresetCompatible.

其中,UIImagePickerControllerImageURLExportPresetCompatible会把 HEIF 格式转成 JPEG。UIImagePickerControllerImageURLExportPresetCurrent 会显示原始的编码格式。

三、编码转换

  1. HEIF 格式转 JPEG 格式

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

    1. NSData * UIImageHEICRepresentation(UIImage *const image, const CGFloat compressionQuality)
    2. {
    3. NSData *imageData = nil;
    4. if (@available(iOS 11.0, *)) {
    5. if (image) {
    6. NSMutableData *destinationData = [NSMutableData new];
    7. CGImageDestinationRef destination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)destinationData, (__bridge CFStringRef)AVFileTypeHEIC, 1, NULL);
    8. if (destination) {
    9. NSDictionary *options = @{(__bridge NSString *)kCGImageDestinationLossyCompressionQuality: @(compressionQuality)};
    10. CGImageDestinationAddImage(destination, image.CGImage, (__bridge CFDictionaryRef)options);
    11. CGImageDestinationFinalize(destination);
    12. imageData = destinationData;
    13. CFRelease(destination);
    14. } else {
    15. // 创建失败,说明设备不支持 HEIF 写入
    16. }
    17. }
    18. }
    19. return imageData;
    20. }

参考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

iOS 影音新格式 HEIF HEVC的更多相关文章

  1. iOS 9应用开发教程之iOS 9新特性

    iOS 9应用开发教程之iOS 9新特性 iOS 9开发概述 iOS 9是目前苹果公司用于苹果手机和苹果平板电脑的最新的操作系统.该操作系统于2015年6月8号(美国时间)被发布.本章将主要讲解iOS ...

  2. Cisco IOS和IOS XE 新漏洞检测与修复

    Cisco IOS/IOS XE 新漏洞检测与修复 CVE-2018-0150 Cisco IOS XE 存在默认弱口令 漏洞影响: 默认弱口令可以导致攻击者直远程登录控制Cisco设备.受影响版本, ...

  3. iOS 8 新特性介绍

    来源:nshipster.cn 发布时间:2014-07-06 阅读次数:2152 随便去问任何人,他们都会告诉你WWDC2014是近年来最为激动的回忆. 整个大会没有发布任何新硬件,它是一次史无前例 ...

  4. 2019-11-29-解决从旧格式的-csproj-迁移到新格式的-csproj-格式-AssemblyInfo-文件值重复问题...

    title author date CreateTime categories 解决从旧格式的 csproj 迁移到新格式的 csproj 格式 AssemblyInfo 文件值重复问题 lindex ...

  5. 2019-7-27-解决从旧格式的-csproj-迁移到新格式的-csproj-格式-AssemblyInfo-文件值重复问题...

    title author date CreateTime categories 解决从旧格式的 csproj 迁移到新格式的 csproj 格式 AssemblyInfo 文件值重复问题 lindex ...

  6. 关于ios对rtsp格式的流媒体支持的一些官方说明

    ios明确不支持rtsp格式的流媒体,基于rtsp/rtp对通用性和防炎墙以及需要开新端口等额外影响稳定性和通用性的原因. 而对http流的视频支持是最好的.虽然有第三方的方式配合ffmpeg库,实现 ...

  7. iOS开发——新特性OC篇&Objective新特性

    Objective新特性 Overview 自 WWDC 2015 推出和开源 Swift 2.0 后,大家对 Swift 的热情又一次高涨起来,在羡慕创业公司的朋友们大谈 Swift 新特性的同时, ...

  8. iOS 9 新特性

    这篇文章介绍了iOS9开发相关的简介,现在发布的设备都会搭载iOS9.这篇文章也列出了详细描述新特性的文章. iPad多线程增强 iOS9使用Slider Over, Split View, Pict ...

  9. iOS 10 新特性 大汇总 及iOS 10 的一些小问题和 xcode 8 的新版本小问题

    iOS 10正式版是很值得升级的,特别是那些不打算购买iPhone 7的老用户,毕竟新系统在体验.流畅性上都做了一些升级. 1.开放电话接口 支持垃圾电话提醒 对于使用iPhone的国人来说,这个功能 ...

随机推荐

  1. POJ3690 Constellations

    嘟嘟嘟 哈希 刚开始我一直在想二维哈希,但发现如果还是按行列枚举的话会破坏子矩阵的性质.也就是说,这个哈希只能维护一维的子区间的哈希值. 所以我就开了个二维数组\(has_{i, j}\)表示原矩阵\ ...

  2. Vue动态实现评分效果

    1.图片分为三种 on:half:  off <style> .star{ font-size: 0; } .star-item{ display: inline-block; backg ...

  3. [Python web开发] 路由实现 (三)

    一.路由 1.1 什么是路由 简单说,就是路怎么走.就是按照不同的路径分发数据. URL就是不同资源的路径,不同路径应该对应不同的应用程序来处理. 所以,代码中要增加对路径的分支处理. 一个简单的路由 ...

  4. Android自定义控件——有弹性的ListView,ScrollView

    上一次我们试验了有弹性的ScrollView.详情 这一次,我们来试验有弹性的ScrollView. 国际惯例,效果图: 主要代码: [java] view plaincopy import andr ...

  5. Reading Fast Packet Processing A Survey

    COMST 2018 主要内容 这是一篇有关快速包转发的综述,先介绍了包转发的有关基础知识和背景,具体介绍了包转发的主流方法,对这些方法进行了细致详尽的比较,最后介绍了最新的方法和未来的研究方向. 包 ...

  6. CCF认证201809-2买菜

    问题描述 小H和小W来到了一条街上,两人分开买菜,他们买菜的过程可以描述为,去店里买一些菜然后去旁边的一个广场把菜装上车,两人都要买n种菜,所以也都要装n次车.具体的,对于小H来说有n个不相交的时间段 ...

  7. GoBelieve IM 消息推送的方案

    消息推送设计方案如下: 所有接入im SDK的deviceTOken都会存储到IM服务器.就可以 IM服务器来根据你们服务器指定的useId来下发消息.判断客户端在线,并且APP在前台.就是socke ...

  8. [iOS]UIFont的lineHeight与pointSize

    写这篇文章的初衷是由于我有一次想获取一个font的字体大小时使用了UIFont的lineHeight属性,结果是比字体的大小要大了一部分,然后经过查阅各种资料,发现了原因. 首先我们来看一看UIFon ...

  9. 留言板(初学者使用js实现)

    代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  10. WebGl 旋转(矩阵变换)

    代码1: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...