基于iOS/Mac平台实现H.265硬编解码
本文我们会着重介绍如何在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硬编解码相关推荐
- 基于国产RK3588+多路H.265视频编解码 转码 3U VPX 方案
一.概述 3U VPX音视频转码模块是信迈科技推出的基于RK3588平台用于音视频的编解码.转码,本模块SDI视频.模拟音频输入,视频进行分辨率和帧率的变换,音频进行采样率和码率等的变换,网口输入的视 ...
- EasyPlayerPro:安卓视频播放器Android H.265硬解码方案(内含代码)
背景介绍 H.265是ITU-TVCEG继H.264之后所制定的新的视频编码标准.H.265标准围绕着现有的视频编码标准H.264,保留原来的某些技术,同时对一些相关的技术加以改进.H.265使用先进 ...
- 启明云端分享| 采用 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 ...
- Android H.265硬解码EasyPlayerPro
H.265编码算法作为新一代视频编码标准,在编码效果上有了很大的进步,同样清晰度的视频,265要比264有着更低的码率.关于265对比264的优越性,网上有更专业的文章来作分析,我也仅对这两种算法略知 ...
- EasyPlayerPro安卓流媒体播放器实现Android H.265硬解码流程
本文转自EasyDarwin团队成员John的博客:http://blog.csdn.net/jyt0551/article/details/74502627 H.265编码算法作为新一代视频编码标准 ...
- 计算机记账软件毕设论文,基于ios移动平台的家庭理财记账app___设计与实现_大学毕设论文.doc...
文档介绍: 本科毕业论文( 设计) 题目: 基于 iOS 移动平台的家庭理财记账 app 的设计与实现学院名称: 计算机与信息工程学院专业名称: 计算机科学与技术学号: 1015070205 学生姓名 ...
- iOS硬编解码相关知识
1.软编与硬编概念 1.1 软编码:使用CPU进行编码. 实现直接.简单,参数调整方便,升级易,但CPU负载重,性能较硬编码低,低码率下质量通常比硬编码要好一点. 1.2 硬编码:不使用CPU进行编码 ...
- 基于NVIDIA显卡的硬编解码的一点心得
前提:小编只是个研究了2个月的NVIDIA硬编解码new guy, 有些写的不明白的地方可以相互交流. 目前因为项目需要,要对硬编解码的实时编码能力做个初步的调研test report. 下面我说下从 ...
- H.266视频编解码标准(H.266的新技术介绍)
H.266多功能视频编码编解码器标准,新的H.266 /VCC编解码器在保持清晰度不变的情况下,数据压缩效率获得极大提高,数据量减少了50%. 新标准的公告中指出,由于改进了压缩技术,H.266将减少 ...
最新文章
- iOS32位唯一标识符
- css出现的问题以及解决,div+css的浮动常出现的问题以及解决办法_html/css_WEB-ITnose...
- 2017.04.15【NOIP2017提高组】模拟赛B组 T2:渡河
- 计算机信息加工的类型及举例,3.1.2计算机信息加工的过程和类型
- Python语言数据类型-----数字和字符串
- 那些查了无数遍的问题
- 能ping通工作组计算机 无法访问,可以ping通不能访问共享,其他电脑可以访问
- Springboot项目整合redis集群
- Python+OpenGL实现虚拟场景中不同物体的拾取与选择
- 13 MySQL--存储过程
- 计算机二级公共知识总结,计算机二级公共基础知识考点总结
- AI未来 - 李开复 - 未来8成的工作受影响 - 读后感
- Cisco Packet Tracer路由器的基本配置
- python下载网页歌曲
- Android踩坑记录:This view is not constrained vertically
- 使用markman助力移动应用开发
- android img 制作工具,Android 镜像文件制作 【ramdisk.img system.img userdata.img】
- 用dosbox执行汇编程序步骤
- 【linux 防火墙】Linux如何关闭防火墙
- Qt Quick 如何入门?