今天在獲取視頻編碼信息的時候,遇到了一個不常見的結(jié)構(gòu)。
先來介紹下背景
- (PHImageRequestID)requestAVAssetForVideo:(PHAsset *)asset
options:(nullable PHVideoRequestOptions *)options
resultHandler:(void (^)(AVAsset *__nullable asset, AVAudioMix *__nullable audioMix, NSDictionary *__nullable info))resultHandler;
這是Photos(系統(tǒng)庫)中的一個用來獲取視頻信息的方法,在回調(diào)中我們拿到asset,實際上,這里我們獲取到的是AVAsset的子類AVURLAsset(這里不必過于糾結(jié))。然后,我們從asset的tracks中遍歷出視頻信息的軌道(通常情況下,tracks包含音頻和視頻各一條的軌道信息),重點來了,看下面這句代碼:
CMVideoFormatDescriptionRef ref = (__bridge CMVideoFormatDescriptionRef)track.formatDescriptions.firstObject;
FourCharCode codeType = CMVideoFormatDescriptionGetCodecType(ref);
從函數(shù)的名字可以看出,第一句是用來獲取視頻軌道的格式描述信息的。第二句是用來獲取codec,也就是視頻的編碼格式,而FourCharCode的定義是這樣的:

企業(yè)微信截圖_02df064d-a22e-4eb7-ab4c-8fb6a561be69.png
可以看到它是一個無符號32位的數(shù)據(jù)類型,但是通過上面提到的CMVideoFormatDescriptionGetCodecType這個方法獲取的數(shù)值我把它打印出來的時候是這樣的情況:

11.png
直接看框起來的部分,居然是字符串,有點匪夷所思了。其實這里剛好是四個字符,而它的名字FourCharCode剛好對應(yīng)上,那么它的32位應(yīng)該就是4個字節(jié)的每個字節(jié)代表一個字符,這中間還要經(jīng)過一層ASCII碼的轉(zhuǎn)換,把字節(jié)數(shù)字轉(zhuǎn)換成對應(yīng)的字符。這樣我們就不它為什么這么表示和定義解釋通了,但是現(xiàn)在我想把這里的字符串取出來賦給一個NSString,該怎么做呢?
答案是我們只能每個字節(jié)每個字節(jié)的把里面的字符取出來,然后拼接。方法如下:
#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)];
算是一種比較少見的表示方法,網(wǎng)上的資料頁比較少,希望能對其他遇到這個的朋友有點幫助。