
下面是第 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):超出范围时,使用指定的边框颜色。这种方式通常用于在超出纹理范围时填充边框颜色,避免黑边。
纹理环绕方式