今天在获取视频编码信息的时候,遇到了一个不常见的结构。
先来介绍下背景
- (PHImageRequestID)requestAVAssetForVideo:(PHAsset *)asset
options:(nullable PHVideoRequestOptions *)options
resultHandler:(void (^)(AVAsset *__nullable asset, AVAudioMix *__nullable audioMix, NSDictionary *__nullable info))resultHandler;
这是Photos(系统库)中的一个用来获取视频信息的方法,在回调中我们拿到asset,实际上,这里我们获取到的是AVAsset的子类AVURLAsset(这里不必过于纠结)。然后,我们从asset的tracks中遍历出视频信息的轨道(通常情况下,tracks包含音频和视频各一条的轨道信息),重点来了,看下面这句代码:
CMVideoFormatDescriptionRef ref = (__bridge CMVideoFormatDescriptionRef)track.formatDescriptions.firstObject;
FourCharCode codeType = CMVideoFormatDescriptionGetCodecType(ref);
从函数的名字可以看出,第一句是用来获取视频轨道的格式描述信息的。第二句是用来获取codec,也就是视频的编码格式,而FourCharCode的定义是这样的:
可以看到它是一个无符号32位的数据类型,但是通过上面提到的CMVideoFormatDescriptionGetCodecType这个方法获取的数值我把它打印出来的时候是这样的情况:
直接看框起来的部分,居然是字符串,有点匪夷所思了。其实这里刚好是四个字符,而它的名字FourCharCode刚好对应上,那么它的32位应该就是4个字节的每个字节代表一个字符,这中间还要经过一层ASCII码的转换,把字节数字转换成对应的字符。这样我们就不它为什么这么表示和定义解释通了,但是现在我想把这里的字符串取出来赋给一个NSString,该怎么做呢?
答案是我们只能每个字节每个字节的把里面的字符取出来,然后拼接。方法如下:
#define FourCC2Str(fourcc) (const char[]){*(((char*)&fourcc)+3), *(((char*)&fourcc)+2), *(((char*)&fourcc)+1), *(((char*)&fourcc)+0),0}
NSString *str = [[NSString alloc] initWithUTF8String:FourCC2Str(codeType)];
算是一种比较少见的表示方法,网上的资料页比较少,希望能对其他遇到这个的朋友有点帮助。