下面是第 23 期面试题精选:
码率控制策略主要分为以下几种:
目前 VideoToolbox 没有属性可以直接设置码率控制策略给调用方,只有开放了 kVTCompressionPropertyKey_DataRateLimits
(为最高码率上限)和 kVTCompressionPropertyKey_AverageBitRate
(编码平均码率)。可以通过 API 属性名称和注释结合编码后的视频码率猜测 VideoToolBox 目前使用的应该是 ABR 视频编码策略。
Annex B 格式通常以 0x000001
或 0x00000001
用于标识 NAL 单元的开始。SPS 和 PPS 按流的方式写在头部。
AVCC 格式使用 NALU 长度(固定字节,通常为 4 字节)分隔 NAL;在头部包含 extradata 或 sequence header 的结构体。
以下是 AnnexB 转换为 AVCC 的思路:
在 VideoToolbox 中,可以通过检查给定的 CMSampleBuffer
是否是视频帧,并且是否是关键帧。通过检查 kCMSampleAttachmentKey_NotSync
键的值,如果它为 false
,则说明这是一个关键帧。以下是示例代码
#import <VideoToolbox/VideoToolbox.h>
BOOL isKeyFrame(CMSampleBufferRef sampleBuffer) {
CMFormatDescriptionRef formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer);
if (!formatDescription) {
return NO;
}
CMMediaType mediaType = CMFormatDescriptionGetMediaType(formatDescription);
if (mediaType != kCMMediaType_Video) {
return NO;
}
CFArrayRef sampleAttachmentsArray = CMSampleBufferGetSampleAttachmentsArray(sampleBuffer, true);
CFDictionaryRef sampleAttachments = (CFDictionaryRef)CFArrayGetValueAtIndex(sampleAttachmentsArray, 0);
BOOL isKeyFrame = !CFDictionaryContainsKey(sampleAttachments, kCMSampleAttachmentKey_NotSync);
return isKeyFrame;
}
重复(GL_Repeat)
:纹理在每个纹理坐标轴上重复出现,当纹理坐标超出 [0,1]
范围时,纹理会在该轴上重复出现。这种方式适用于创建无缝平铺效果。这是对纹理的默认行为。镜像重复(GL_MIRRORED_REPEAT)
:与重复(GL_Repeat)方式相似,但当纹理坐标超出 [0,1]
范围时,会将其镜像翻转后再重复出现。这可以有效减少纹理重复造成的视觉疲劳。夹取到边缘(GL_CLAMP_TO_EDGE)
:与夹取方式类似,但在超出范围时,会使用边缘纹素的颜色,产生一种边缘被拉伸的效果。夹取到边框(GL_CLAMP_TO_BORDER)
:超出范围时,使用指定的边框颜色。这种方式通常用于在超出纹理范围时填充边框颜色,避免黑边。纹理环绕方式