iOS AVFoundation之AVMetadataItem

AVMetadataItem其實(shí)就是一個(gè)模型類(lèi), 主要是用來(lái)保存音視頻等多媒體資料的各種附加信息。稱(chēng)之為元數(shù)據(jù)壤躲。
例如:作者, 標(biāo)題备燃, 創(chuàng)建時(shí)間柒爵, 封面等描述關(guān)于這個(gè)多媒體的一些常見(jiàn)描述信息。
在分析這個(gè)之前赚爵,大家可以下載一個(gè)元數(shù)據(jù)分析工具棉胀,對(duì)一個(gè)多媒體文件進(jìn)行詳細(xì)的分析法瑟, 有助于我們學(xué)習(xí)AVFoundation, 大家可以去蘋(píng)果工具下載中心 搜索Atom Inspector 進(jìn)行下載
大家也可以到AVFoundation(二):核心AVAsset先去了解一下AVFoundation核心類(lèi),詳細(xì)介紹了Atom Inspector的用法 這里主要介紹AVMetadataItem

  1. AVMetadataItem獲取

AVMetadataItem還有一個(gè)子類(lèi)AVMutableMetadataItem唁奢, 他們兩主要的區(qū)別就是一個(gè)不可變霎挟, 一個(gè)可變的, AVMetadataItem的屬性基本都是只讀(readonly)的麻掸, 而AVMutableMetadataItem的屬性是可讀可寫(xiě)(readwrite)酥夭。
AVMutableMetadataItem 除了常規(guī)的init的方法創(chuàng)建還可以通過(guò)+ (AVMutableMetadataItem *)metadataItem; 這個(gè)類(lèi)方法創(chuàng)建。
AVMetadataItem: 這個(gè)一般不自己創(chuàng)建而是從AVAssetTrack 和 AVAsset獲取到AVMetadataItem數(shù)組脊奋, 一個(gè)AVMetadataItem對(duì)象存放著一個(gè)信息熬北。

  NSURL *assetUrl = [[NSBundle mainBundle] URLForResource:@"Hubblecast" withExtension:@"mov"];
    AVAsset *videoAsset = [AVAsset assetWithURL:assetUrl];
    NSArray *keys = @[@"tracks", @"availableMetadataFormats"];
    [self obtainAVMetadataItem:videoAsset];
    [videoAsset loadValuesAsynchronouslyForKeys:keys completionHandler:^{
        NSError *error = nil;
        //獲取加載tracks的狀態(tài), 作出相應(yīng)的操作
       AVKeyValueStatus status =  [videoAsset statusOfValueForKey:@"tracks" error:&error];
        switch (status) {
            case AVKeyValueStatusUnknown:
                NSLog(@"AVKeyValueStatusUnknown");
                //加載tracks未知錯(cuò)誤
                break;
            case AVKeyValueStatusFailed:
                NSLog(@"AVKeyValueStatusFailed");
                //加載tracks失敗
                break;
            case AVKeyValueStatusLoading:
                NSLog(@"AVKeyValueStatusLoading");
                //加載tracks中
                break;
            case AVKeyValueStatusLoaded:
                NSLog(@"AVKeyValueStatusLoaded");
                //加載tracks完畢
                break;
            case AVKeyValueStatusCancelled:
                NSLog(@"AVKeyValueStatusCancelled");
                //取消加載tracks
                break;
                
        }
        
         status =  [videoAsset statusOfValueForKey:@"availableMetadataFormats" error:&error];
        switch (status) {
            case AVKeyValueStatusUnknown:
                NSLog(@"AVKeyValueStatusUnknown");
                //加載AVKeyValueStatusUnknown未知錯(cuò)誤
                break;
            case AVKeyValueStatusFailed:
                NSLog(@"AVKeyValueStatusFailed");
                //加載AVKeyValueStatusUnknown失敗
                break;
            case AVKeyValueStatusLoading:
                NSLog(@"AVKeyValueStatusLoading");
                //加載AVKeyValueStatusUnknown中
                break;
            case AVKeyValueStatusLoaded:
            {
                NSLog(@"AVKeyValueStatusLoaded");
                //加載AVKeyValueStatusUnknown完畢
               //獲取videoAsset里面的元數(shù)據(jù)
                NSMutableArray *metadata = [NSMutableArray array];
                for (NSString *format in videoAsset.availableMetadataFormats) {
                    NSLog(@"%@", format);
                    NSLog(@"%@", [videoAsset metadataForFormat:format]);
                    [metadata addObject:[videoAsset metadataForFormat:format]];
                    
                    
                }
                for (AVMetadataItem *item in metadata.firstObject) {
                    NSLog(@"%@--%@\n",item.key, item.value);
                }
                [self keySpac:metadata];
                
                break;
            }
            case AVKeyValueStatusCancelled:
                NSLog(@"AVKeyValueStatusCancelled");
                //取消加載AVKeyValueStatusUnknown
                break;
                
        }
    }];
    

這里要注意的是AVFoundation里面很多類(lèi)的屬性都是用到時(shí)才加載诚隙,對(duì)于一些加載過(guò)程中比較耗時(shí)的屬性讶隐,遵守了AVAsynchronousKeyValueLoading這個(gè)協(xié)議,使用異步加載的方式久又,防止界面卡頓
loadValuesAsynchronouslyForKeys 和 statusOfValueForKey
使用注意點(diǎn)
loadValuesAsynchronouslyForKeys 中的不管在keys中設(shè)置了多少個(gè)屬性值巫延, completionHandler只會(huì)調(diào)用一次,
所以在 completionHandler中獲取 AVKeyValueStatus狀態(tài)在keys有多個(gè)是不準(zhǔn)確的地消, 得每個(gè)屬性分開(kāi)炉峰, 一個(gè)key對(duì)應(yīng)一個(gè)statusOfValueForKey中獲取加載狀態(tài)

  1. AVMetadataItem分析

我們打印這個(gè)視頻的創(chuàng)建時(shí)間AVMetadataItem出來(lái)看看:

 "<AVMetadataItem: 0x6100000139f0, identifier=mdta/com.apple.quicktime.year, keySpace=mdta, key class = __NSCFString, key=com.apple.quicktime.year, commonKey=(null), extendedLanguageTag=en-US, dataType=com.apple.metadata.datatype.UTF-8, time={INVALID}, duration={INVALID}, startDate=(null), extras={\n    dataType = 1;\n    dataTypeNamespace = \"com.apple.quicktime.mdta\";\n}, value=2013>"

再結(jié)合他的屬性:


/* Indicates the identifier of the metadata item. Publicly defined identifiers are declared in AVMetadataIdentifiers.h. */
@property (nonatomic, readonly, copy, nullable) NSString *identifier NS_AVAILABLE(10_10, 8_0);

/* indicates the IETF BCP 47 (RFC 4646) language identifier of the metadata item; may be nil if no language tag information is available */
@property (nonatomic, readonly, copy, nullable) NSString *extendedLanguageTag NS_AVAILABLE(10_10, 8_0);

/* indicates the locale of the metadata item; may be nil if no locale information is available for the metadata item */
@property (nonatomic, readonly, copy, nullable) NSLocale *locale;

/* indicates the timestamp of the metadata item. */
@property (nonatomic, readonly) CMTime time;

/* indicates the duration of the metadata item */
@property (nonatomic, readonly) CMTime duration NS_AVAILABLE(10_7, 4_2);

/* indicates the data type of the metadata item's value.  Publicly defined data types are declared in <CoreMedia/CMMetadata.h> */
@property (nonatomic, readonly, copy, nullable) NSString *dataType NS_AVAILABLE(10_10, 8_0);

/* provides the value of the metadata item */
@property (nonatomic, readonly, copy, nullable) id<NSObject, NSCopying> value;

/* provides a dictionary of the additional attributes */
@property (nonatomic, readonly, copy, nullable) NSDictionary<NSString *, id> *extraAttributes;


可以看出, 每個(gè)屬性相對(duì)應(yīng)的值脉执。所以我們可以很直觀的把AVMetadataItem就是我們平時(shí)開(kāi)發(fā)中用到的模型疼阔。里面都是鍵值對(duì)的存在 。

  1. 篩選AVMetadataItem

/*!
 @method            metadataItemsFromArray:withLocale:
 @discussion        Instead, use metadataItemsFromArray:filteredAndSortedAccordingToPreferredLanguages:.
 */
+ (NSArray<AVMetadataItem *> *)metadataItemsFromArray:(NSArray<AVMetadataItem *> *)metadataItems withLocale:(NSLocale *)locale;

/*!
 @method            metadataItemsFromArray:withKey:keySpace:
 @discussion        Instead, use metadataItemsFromArray:filteredByIdentifier:.
 */
+ (NSArray<AVMetadataItem *> *)metadataItemsFromArray:(NSArray<AVMetadataItem *> *)metadataItems withKey:(nullable id)key keySpace:(nullable NSString *)keySpace;

/*!
 @method        metadataItemsFromArray:filteredAndSortedAccordingToPreferredLanguages:
 @abstract      Filters an array of AVMetadataItems according to whether their locales match any language identifier in the specified array of preferred languages. The returned array is sorted according to the order of preference of the language each matches.
 @param         metadataItems
                An array of AVMetadataItems to be filtered and sorted.
 @param         preferredLanguages
                An array of language identifiers in order of preference, each of which is an IETF BCP 47 (RFC 4646) language identifier. Use +[NSLocale preferredLanguages] to obtain the user's list of preferred languages.
 @result        An instance of NSArray containing metadata items of the specified NSArray that match a preferred language, sorted according to the order of preference of the language each matches.
*/
+ (NSArray<AVMetadataItem *> *)metadataItemsFromArray:(NSArray<AVMetadataItem *> *)metadataItems filteredAndSortedAccordingToPreferredLanguages:(NSArray<NSString *> *)preferredLanguages NS_AVAILABLE(10_8, 6_0);

/*!
    @method         metadataItemsFromArray:filteredByIdentifier:
    @abstract           Filters an array of AVMetadataItems according to identifier.
    @param          metadataItems
    An array of AVMetadataItems to be filtered by identifier.
    @param          identifier
    The identifier that must be matched for a metadata item to be copied to the output array. Items are considered a match not only when their identifiers are equal to the specified identifier, and also when their identifiers conform to the specified identifier.
    @result         An instance of NSArray containing the metadata items of the target NSArray that match the specified identifier.
*/
+ (NSArray<AVMetadataItem *> *)metadataItemsFromArray:(NSArray<AVMetadataItem *> *)metadataItems filteredByIdentifier:(NSString *)identifier NS_AVAILABLE(10_10, 8_0);

/*!
    @method         metadataItemsFromArray:filteredByMetadataItemFilter:
    @abstract       Filters an array of AVMetadataItems using the supplied AVMetadataItemFilter.
    @param          metadataItems
                    An array of AVMetadataItems to be filtered.
    @param          metadataItemFilter
                    The AVMetadataItemFilter object for filtering the metadataItems.
    @result         An instance of NSArray containing the metadata items of the target NSArray that have not been removed by metadataItemFilter.
*/
+ (NSArray<AVMetadataItem *> *)metadataItemsFromArray:(NSArray<AVMetadataItem *> *)metadataItems filteredByMetadataItemFilter:(AVMetadataItemFilter *)metadataItemFilter NS_AVAILABLE(10_9, 7_0);

里面有好幾個(gè)方法進(jìn)行篩選的半夷, 傳進(jìn)一個(gè)篩選前的AVMetadataItem數(shù)組進(jìn)去竿开,根據(jù)identifier, preferredLanguages進(jìn)行篩選玻熙, 這兩個(gè)比較簡(jiǎn)單否彩。
而 根據(jù)key和keySpace的話(huà)就要注意文件的類(lèi)型了
這里的keySpace是根據(jù)文件的類(lèi)型來(lái)的
1、 iTunes: iTunes 包括 Audio/Video 文件格式一般有:.mp4, .m4v, .m4a; 對(duì)應(yīng)的 keySpace 是 AVMetadataKeySpaceiTunes

2嗦随、 Quicktime Metadata 包括 Quicktime movie 格式有: .mov 對(duì)應(yīng)的 keySpace 是 AVMetadataKeySpaceQuickTimeMetadata

3列荔、 Quicktime User Dara 包括 Quicktime movie 格式有: .mov 對(duì)應(yīng)的 keySpace 是 AVMetadataKeySpaceQuickTimeUserData

4、 ID3 包括 MPEG Layer III 格式有:.mp3 對(duì)應(yīng)的 keySpace 是 AVMetadataKeySpaceID3

5枚尼、其中Common類(lèi)型包括了 iTunes, Quicktime Metadata, Quicktime User Dara, ID3等等 是一個(gè)匯總 對(duì)應(yīng)的 keySpace 是AVMetadataKeySpaceCommon
根據(jù)相對(duì)應(yīng)進(jìn)去點(diǎn)進(jìn)去 keySpace 底下就是 key贴浙, 根據(jù)key獲取作者,標(biāo)題署恍,子標(biāo)題崎溃, 創(chuàng)建時(shí)間, 時(shí)長(zhǎng)等信息 都在AVMetadataFormat.h 中
所以一般我們用 AVMetadataKeySpaceCommon 和 AVMetadataKeySpaceCommon底下的key能滿(mǎn)足我們的需求了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盯质,一起剝皮案震驚了整個(gè)濱河市袁串,隨后出現(xiàn)的幾起案子概而,更是在濱河造成了極大的恐慌,老刑警劉巖囱修,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赎瑰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡破镰,警方通過(guò)查閱死者的電腦和手機(jī)餐曼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鲜漩,“玉大人源譬,你說(shuō)我怎么就攤上這事≡兴疲” “怎么了踩娘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鳞青。 經(jīng)常有香客問(wèn)我霸饲,道長(zhǎng)为朋,這世上最難降的妖魔是什么臂拓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮习寸,結(jié)果婚禮上胶惰,老公的妹妹穿的比我還像新娘。我一直安慰自己霞溪,他們只是感情好孵滞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著鸯匹,像睡著了一般坊饶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上殴蓬,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天匿级,我揣著相機(jī)與錄音,去河邊找鬼染厅。 笑死痘绎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肖粮。 我是一名探鬼主播孤页,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼涩馆!你這毒婦竟也來(lái)了行施?” 一聲冷哼從身側(cè)響起允坚,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悲龟,沒(méi)想到半個(gè)月后屋讶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡须教,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年皿渗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轻腺。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乐疆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贬养,到底是詐尸還是另有隱情挤土,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布误算,位于F島的核電站仰美,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏儿礼。R本人自食惡果不足惜咖杂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蚊夫。 院中可真熱鬧诉字,春花似錦、人聲如沸知纷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)琅轧。三九已至伍绳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乍桂,已是汗流浹背冲杀。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留模蜡,地道東北人漠趁。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像忍疾,于是被迫代替她去往敵國(guó)和親闯传。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容