關(guān)于FourCharCode

今天在獲取視頻編碼信息的時候,遇到了一個不常見的結(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)上的資料頁比較少,希望能對其他遇到這個的朋友有點幫助。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容