2011-04-25 14 views
9

我有一個適用於iPhone的視頻錄製應用程序。我正在使用AVAssetWriter將錄製的視頻數據寫入文件。我也有興趣將自定義元數據嵌入到文件中。例如:我想將我的應用程序標識爲視頻的創建者。設置和檢索AVMetadataCommonKeyCreator的值的問題

因此,創建資產編寫器後,我將使用密鑰AVMetadataCommonKeyCreator的創建者值添加到資產編寫器的元數據中。

代碼片段如下:

AVAssetWriter *assetWrtr = [[AVAssetWriter alloc] initWithURL:inURL fileType:AVFileTypeQuickTimeMovie error:&error]; 
self.assetWriter = assetWrtr; 
[assetWrtr release]; 

NSArray *existingMetadataArray = self.assetWriter.metadata; 
NSMutableArray *newMetadataArray = nil; 
if (existingMetadataArray) 
{ 
    newMetadataArray = [existingMetadataArray mutableCopy]; // To prevent overriding of existing metadata 
} 
else 
{ 
    newMetadataArray = [[NSMutableArray alloc] init]; 
} 

AVMutableMetadataItem *item = [[AVMutableMetadataItem alloc] init]; 
item.keySpace = AVMetadataKeySpaceCommon; 
item.key = AVMetadataCommonKeyCreator; 
item.value = @"My App"; 

[newMetadataArray addObject:item]; 
self.assetWriter.metadata = newMetadataArray; 
[newMetadataArray release]; 
[item release]; 

一旦完成錄音後,我試圖讀取使用AVURLAsset該文件的內容。

NSURL *outputFileURL = [self.assetWriter outputURL]; 
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:outputFileURL options:nil]; 
NSArray *keys = [NSArray arrayWithObject:@"commonMetadata"]; 

[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^(void) { 

    NSError *error = nil; 
    AVKeyValueStatus durationStatus = [asset statusOfValueForKey:@"commonMetadata" error:&error]; 
    switch (durationStatus) { 
     case AVKeyValueStatusLoaded: 
      NSLog(@"AVKeyValueStatusLoaded"); 
      NSLog(@"commonMetadata:%@", [asset commonMetadata]); 
      break; 
     case AVKeyValueStatusFailed: 
      NSLog(@"AVKeyValueStatusFailed"); 
      break; 
     case AVKeyValueStatusCancelled: 
      NSLog(@"AVKeyValueStatusCancelled"); 
      break; 
    } 
}]; 

然而[asset commonMetadata]不返回任何AVMetadataItems。它返回一個空數組。 我可以設置其他元數據對象的值,如AVMetadataCommonKeyTitleAVMetadataCommonKeyModelAVMetadataCommonKeySource。這些值被正確檢索。該問題僅在AVMetadataCommonKeyCreator。請讓我知道這種行爲的原因。是不是可以爲AVMetadataCommonKeyCreator設置應用特定值?這個鍵實際代表什麼?

+0

我仍然有對什麼事上iOS7同樣的問題,AVMetadataCommonKeyCreator不會被保存。有時間向蘋果報告我想。 – Dado 2014-04-21 03:17:52

+0

無法通過iOS 8.1中的'AVAssetWriter'獲取任何類型的元數據以保存爲任何文件格式。 @Dado做了什麼來自您的報告? – OrangeDog 2014-12-22 13:29:16

回答

2

我在一年前遇到同樣的問題。當我使用AVFoundation編寫音頻文件時,我沒有看到任何元數據。我認爲AVMetadataCommonKeyCreator不起作用。我現在不能說,但事實如此。

我使用C庫taglib解決了這個問題http://taglib.github.com 爲iOS構建這個庫真的很容易。我認爲你可以刪除一些文件,如果你不能編譯它。

1

我還想確認AVMetadataCommonKeyCreator不會被保存到視頻資源的元數據中。我嘗試過的其他人(AVMetadataCommonKeyTitleAVMetadataCommonKeyDescription等)可以工作。我的基礎SDK是iOS 8.2。

創作者密鑰有什麼特別之處嗎?蘋果是否保留它用於其他用途?是否還有其他密鑰僅限於我們(或者只是不工作)?

(我沒有充裕的時間來測試23個AVMetadataCommonKeys每一個..)