问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

iOS H264,H265视频编码(Video encode)

发布网友 发布时间:2022-09-14 03:44

我来回答

1个回答

热心网友 时间:2024-10-25 04:58

H264进行编码,iOS 11 之后,iPhone 7以上的设备可以支持新的编码器H265编码器,使得同等质量视频占用的存储空间更小。所以本例中可以使用两种方式实现视频数据的编码

系统已经提供VTIsHardwareDecodeSupported判断当前设备是否支持H265编码

1> g_isSupportRealTimeEncoder = (is64Bit == 8) ? true : false; 用来判断当前设备是32位还是64位

2> 创建H264/H265Session 区别仅仅为参数的不同,h264为kCMVideoCodecType_H264。 h265为kCMVideoCodecType_HEVC,在创建Session指定了回调函数后,当编码成功一帧就会调用相应的回调函数。

3> 通过 [self getSupportedPropertyFlags]; 获取当前编码器支持设置的属性,经过测试,H265不支持码率的*。目前暂时得不到解决。等待苹果后续处理。

4> 之后设置编码器相关属性,下面会具体介绍,设置完成后则调用VTCompressionSessionPrepareToEncodeFrames准备编码。

上述方法主要设置启动编码器所需的各个参数

1> kVTCompressionPropertyKey_MaxFrameDelayCount : 压缩器被允许保持的最大帧数在输出一个压缩帧之前。例如如果最大帧延迟数是M,那么在编码帧N返回的调用之前,帧N-M必须被排出。

2> kVTCompressionPropertyKey_ExpectedFrameRate : 设置fps

3> kVTCompressionPropertyKey_AverageBitRate : 它不是强制的*,bit rate可能会超出峰值

4> kVTCompressionPropertyKey_RealTime : 设置编码器是否实时编码,如果设置为False则不是实时编码,视频效果会更好一点。

5> kVTCompressionPropertyKey_AllowFrameReordering : 是否让帧进行重新排序。为了编码B帧,编码器必须对帧重新排序,这将意味着解码的顺序与显示的顺序不同。将其设置为false以防止帧重新排序。

6> kVTCompressionPropertyKey_ProfileLevel : 指定编码比特流的配置文件和级别

7> kVTCompressionPropertyKey_H264EntropyMode :如果支持h264该属性设置编码器是否应该使用基于CAVLC 还是 CABAC

8> kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration : 两个I帧之间最大持续时间,该属性特别有用当frame rate是可变

以上方法在每采集到一帧视频数据后会调用一次,我们将拿到的每一帧数据进行编码。

1> 通过frameID的递增构造时间戳为了使编码后的每一帧数据连续

2> 设置最大码率的*,注意:H265目前不支持设置码率的*,等待官方后续通知。可以对H264进行码率*

3> kVTCompressionPropertyKey_DataRateLimits : 将数据的bytes和ration封装到CFMutableArrayRef传给API进行调用

4> VTCompressionSessionEncodeFrame : 调用此方法成功后触发回调函数完成编码。

1> 首先在回调函数中截取到I帧,从I帧中提取到(h265中新增vps),sps,pps信息并写入文件
2> 遍历其他帧将头信息0000,0001写入每个头信息中,再将该数据写入文件即可

这里我们简单介绍一下H264,H265码流信息

注意在H265流数据中新增vps在最前。

流数据中,属性集合可能是这样的:

经过处理之后,在Format Description中则是:

根据上述得到CMVideoFormatDescriptionRef、CMBlockBufferRef和可选的时间信息,使用CMSampleBufferCreate接口得到CMSampleBuffer数据这个待解码的原始的数据。如下图所示的H264数据转换示意图。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
什么叫补按揭 后按揭贷款什么意思 买房者续按揭有什么危害 加按揭是什么意思 八月中国最凉快的地方 八月份哪里最凉快,去哪旅游好?美丽的地方 乱字同韵字是什么意思 华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... 陕西职务侵占案立案准则 结婚后我的恋情维系了十年,怎么做到的? 联想e531win7不卡,xp系统卡怎么办 thinkpadE531 开机后很卡拔掉电源线又恢复了,而且出现USB鼠标无法使用... 视频编码AVC1和H264一样吗- 问一问 疫情期能不能按时开学 固安县第六中学七月一号小学生能放暑假吗? 河北中小学能按时开学吗开春? 电脑开机出现显卡设置不能进入桌面- 问一问 怎样才能拒加好友消息 登不上去怎么注销? 电脑本地磁盘的已用空间与实际用的空间不一致 为什我的D盘所显示的已用空间与实际所用空间严重不符? 电脑D盘显示可用容量与实际容量不符合,帮忙查找原因 为什么我的D盘实际可用空间与显示可用空间相差很多 为什么d盘已用空间和实际文件使用大小严重不符。 电脑D盘已用空间与实际相差太远,这是咋回事? 怎样免费搞QQ空间封面 怎么查看主动加添加微信的人的? 换了之前的好友怎么加回来? ...已经更换。然后对方有我之前拒绝他好友添加的界面。对方还能加... 换了,怎么把之前的好友都加回来? 玩LOL卡。 笔记本、联想thinkpadE531、求解决 联想e531装win7后出现卡顿怎么处理? 反应慢! 联想e531开机慢是怎么回事 联想笔记本E531,68854UC玩cf,每次进去一小时左右就显示out of memory... ...下载东西更慢,我的电脑是联想e531,我该怎么办 电热水器可以安在出水口低的地方吗? 联想E531玩游戏卡顿,最小化的时候尤其严重 电热水器如果安装在比人还低的地方,会不会有水出来。 推荐一款比较好的防晒霜 注销之后手机号可以重新注册吗- 问一问 注销之后手机号可以重新注册吗 取消恢复上一次的正确设置 学习台钓的时候应避免的5个误区是什么呢? 我独自狩猎在哪看 科学考察是什么意思 海洋测量船的种类划分 苹果6进水开不了机怎么办-苹果手机进水怎么修 通过怎么添加好友 怎么加好友 网上的那些话费充值代理是真的吗?