本文我们会着重介绍如何在iOS/Mac上使用系统API进行H.265硬编硬解功能,读者需要有使用VideoToolBox进行硬编/解码的相关经验。

一般提到H.265,都难免要和H.264对比一番,以下是两者的对比情况:

关于iOS/Mac系统对视频编解码的限制:

Encode

Decode

H.264

>=iOS8.0

>=macOS10.9

>=iOS8.0

>=macOS10.9

H.265

>=iOS11.0 && iPhone 7及以上

>=macOS10.13 && 2016及以后生产的Mac

2018及以后的MacBookAir

>=iOS11.0 && iPhone 6s及以上

>=macOS10.13 && 2016及以后生产的Mac

使用VideoToolBox编解码:

由于都是调用VideoToolBox框架实现H.264/H.265编解码,接口都是通用的,主要的区别在于enable codec时的codec类型设置,根据不同的codec类型设置codec profile,sample rate,video format等参数。大致流程如下:

编码流程:

(1) 创建编码会话:

使用VTCompressionSessionCreate函数创建一个VTCompressionSessionRef类型的压缩会话,通过设置压缩参数和回调函数等属性初始化会话。

VT_EXPORT OSStatus
VTCompressionSessionCreate(CM_NULLABLE CFAllocatorRef                          allocator,int32_t                                             width,int32_t                                             height,CMVideoCodecType                                    codecType,CM_NULLABLE CFDictionaryRef                         encoderSpecification,CM_NULLABLE CFDictionaryRef                         sourceImageBufferAttributes,CM_NULLABLE CFAllocatorRef                          compressedDataAllocator,CM_NULLABLE VTCompressionOutputCallback             outputCallback,void * CM_NULLABLE                                  outputCallbackRefCon,CM_RETURNS_RETAINED_PARAMETER CM_NULLABLE VTCompressionSessionRef * CM_NONNULL compressionSessionOut) API_AVAILABLE(macosx(10.8), ios(8.0), tvos(10.2));

如果使用H.264编码功能,参数codecType需要设置为kCMVideoCodecType_H264;

如果使用H.265功能,参数codecType需要设置为kCMVideoCodecType_HEVC;

(2) 设置回调函数:

使用VTCompressionSessionSetProperty函数设置VTCompressionOutputCallback回调函数,用于在视频数据编码完成后获取编码数据。

typedef void (*VTCompressionOutputCallback)(void * CM_NULLABLE outputCallbackRefCon,void * CM_NULLABLE sourceFrameRefCon, OSStatus status, VTEncodeInfoFlags infoFlags,CM_NULLABLE CMSampleBufferRef sampleBuffer );

(3) 设置源数据:

使用VTCompressionSessionSetProperty函数设置源数据的格式和参数,包括像素格式、分辨率、帧率、比特率等。

VT_EXPORT OSStatus
VTCompressionSessionEncodeFrame(CM_NONNULL VTCompressionSessionRef  session,CM_NONNULL CVImageBufferRef         imageBuffer,CMTime                              presentationTimeStamp,CMTime                              duration, // may be kCMTimeInvalidCM_NULLABLE CFDictionaryRef         frameProperties,void * CM_NULLABLE                  sourceFrameRefCon,VTEncodeInfoFlags * CM_NULLABLE     infoFlagsOut ) API_AVAILABLE(macosx(10.8), ios(8.0), tvos(10.2));

(4) 编码:

使用VTCompressionSessionEncodeFrame函数将原始视频帧编码为指定格式的视频数据。编码过程中可以设置一些属性,如是否为关键帧、帧时间戳等。

VT_EXPORT OSStatus
VTSessionSetProperty(CM_NONNULL VTSessionRef       session,CM_NONNULL CFStringRef        propertyKey,CM_NULLABLE CFTypeRef         propertyValue ) API_AVAILABLE(macosx(10.8), ios(8.0), tvos(10.2));
VT_EXPORT OSStatus
VTCompressionSessionPrepareToEncodeFrames( CM_NONNULL VTCompressionSessionRef session ) API_AVAILABLE(macosx(10.9), ios(8.0), tvos(10.2));

(5) 获取编码数据:

在回调函数中获取编码后的视频数据,并进行相应的处理,如写入文件、传输到网络等。

解码流程:

(1) 创建解码会话:

使用VTDecompressionSessionCreate函数创建一个VTDecompressionSessionRef类型的解码会话,通过设置解码参数和回调函数等属性初始化会话。

VT_EXPORT OSStatus
VTDecompressionSessionCreate(kCFAllocatorDefault, _videoDesc, NULL, (__bridge CFDictionaryRef _Nullable)(destinationPixBufferAttrs), &callbackRecord, &_decodeSession
);

(2) 设置回调函数:

使用VTDecompressionSessionSetOutputCallback函数设置VTDecompressionOutputCallback回调函数,用于在视频数据解码完成后获取解码数据。

(3) 设置源数据:

使用VTDecompressionSessionSetProperty函数设置源数据的格式和参数,包括像素格式、分辨率、帧率等。

(4) 解码:

使用VTDecompressionSessionDecodeFrame函数将视频数据解码为原始视频帧。解码过程中可以设置一些属性,如是否需要保留最后一帧、帧时间戳等。

VTDecodeFrameFlags flags = 0;
VTDecodeInfoFlags flagOut = 0;
// 默认是同步操作。
// 调用didDecompress,返回后再回调
OSStatus decodeStatus = VTDecompressionSessionDecodeFrame(mDecodeSession,sampleBuffer,flags,&outputPixelBuffer,//输出解码数据&flagOut);

(5) 获取解码数据:

在回调函数中获取解码后的原始视频帧数据,并进行相应的处理,如显示到屏幕上。

注:本文中默认读者已经具备利用VideoToolBox硬编解码相关经验。如果还有疑问可以持续关注小编后续有关这部分的文章。喜欢的可以点赞

基于iOS/Mac平台实现H.265硬编解码相关推荐

  1. 基于国产RK3588+多路H.265视频编解码 转码 3U VPX 方案

    一.概述 3U VPX音视频转码模块是信迈科技推出的基于RK3588平台用于音视频的编解码.转码,本模块SDI视频.模拟音频输入,视频进行分辨率和帧率的变换,音频进行采样率和码率等的变换,网口输入的视 ...

  2. EasyPlayerPro:安卓视频播放器Android H.265硬解码方案(内含代码)

    背景介绍 H.265是ITU-TVCEG继H.264之后所制定的新的视频编码标准.H.265标准围绕着现有的视频编码标准H.264,保留原来的某些技术,同时对一些相关的技术加以改进.H.265使用先进 ...

  3. 启明云端分享| 采用 B to B设计的RK3399核心板来了,邮票孔,支持4K、H.265 硬解码;核心板内置 EDP、MIPI-DSI、HDMI、DP 显示接口,带有 2 路 MIPI-CSI

    RK3399核心板(邮票孔)–IDO-SOM3909 提示:启明云端旗下触觉智能 采用 B to B设计的RK3399核心板来了,邮票孔,支持4K.H.265 硬解码:核心板内置 EDP.MIPI-D ...

  4. Android H.265硬解码EasyPlayerPro

    H.265编码算法作为新一代视频编码标准,在编码效果上有了很大的进步,同样清晰度的视频,265要比264有着更低的码率.关于265对比264的优越性,网上有更专业的文章来作分析,我也仅对这两种算法略知 ...

  5. EasyPlayerPro安卓流媒体播放器实现Android H.265硬解码流程

    本文转自EasyDarwin团队成员John的博客:http://blog.csdn.net/jyt0551/article/details/74502627 H.265编码算法作为新一代视频编码标准 ...

  6. 计算机记账软件毕设论文,基于ios移动平台的家庭理财记账app___设计与实现_大学毕设论文.doc...

    文档介绍: 本科毕业论文( 设计) 题目: 基于 iOS 移动平台的家庭理财记账 app 的设计与实现学院名称: 计算机与信息工程学院专业名称: 计算机科学与技术学号: 1015070205 学生姓名 ...

  7. iOS硬编解码相关知识

    1.软编与硬编概念 1.1 软编码:使用CPU进行编码. 实现直接.简单,参数调整方便,升级易,但CPU负载重,性能较硬编码低,低码率下质量通常比硬编码要好一点. 1.2 硬编码:不使用CPU进行编码 ...

  8. 基于NVIDIA显卡的硬编解码的一点心得

    前提:小编只是个研究了2个月的NVIDIA硬编解码new guy, 有些写的不明白的地方可以相互交流. 目前因为项目需要,要对硬编解码的实时编码能力做个初步的调研test report. 下面我说下从 ...

  9. H.266视频编解码标准(H.266的新技术介绍)

    H.266多功能视频编码编解码器标准,新的H.266 /VCC编解码器在保持清晰度不变的情况下,数据压缩效率获得极大提高,数据量减少了50%. 新标准的公告中指出,由于改进了压缩技术,H.266将减少 ...

最新文章

  1. iOS32位唯一标识符
  2. css出现的问题以及解决,div+css的浮动常出现的问题以及解决办法_html/css_WEB-ITnose...
  3. 2017.04.15【NOIP2017提高组】模拟赛B组 T2:渡河
  4. 计算机信息加工的类型及举例,3.1.2计算机信息加工的过程和类型
  5. Python语言数据类型-----数字和字符串
  6. 那些查了无数遍的问题
  7. 能ping通工作组计算机 无法访问,可以ping通不能访问共享,其他电脑可以访问
  8. Springboot项目整合redis集群
  9. Python+OpenGL实现虚拟场景中不同物体的拾取与选择
  10. 13 MySQL--存储过程
  11. 计算机二级公共知识总结,计算机二级公共基础知识考点总结
  12. AI未来 - 李开复 - 未来8成的工作受影响 - 读后感
  13. Cisco Packet Tracer路由器的基本配置
  14. python下载网页歌曲
  15. Android踩坑记录:This view is not constrained vertically
  16. 使用markman助力移动应用开发
  17. android img 制作工具,Android 镜像文件制作 【ramdisk.img system.img userdata.img】
  18. 用dosbox执行汇编程序步骤
  19. 【linux 防火墙】Linux如何关闭防火墙
  20. Qt Quick 如何入门?

热门文章

  1. c++ 无穷大怎么表示_怎么确认贴片二极管型号
  2. 竞聘计算机学院副院长演讲稿,竞聘教育学院副院长演讲稿
  3. day46--快速排序
  4. ISTQB- TA大纲
  5. matlab工具箱简述 自用
  6. JEECG 集成KiSSO单点登录实现统一身份认证
  7. 【RDMA】InfiniBand IB常用命令|历史命令记录
  8. Android 根据账号和密码自动连接 WIFI (兼容Android 10)
  9. markdown修改字体、颜色
  10. Python快速编程入门 第2版 实训案例及课后编程题