Проблема с установкой и получением значения AVMetadataCommonKeyCreator - PullRequest
9 голосов
/ 25 апреля 2011

У меня есть приложение для записи видео для iPhone. Я использую AVAssetWriter для записи записанных видеоданных в файл. Я также заинтересован во внедрении пользовательских метаданных в файл. Например: я хочу определить свое приложение как создателя видео.

Следовательно, после создания средства записи активов я добавляю значение создателя с помощью ключа 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. Возвращает пустой массив. Я могу установить значения других объектов метаданных, таких как AVMetadataCommonKeyTitle, AVMetadataCommonKeyModel, AVMetadataCommonKeySource. Эти значения получены правильно. Проблема только с AVMetadataCommonKeyCreator. Пожалуйста, дайте мне знать причину такого поведения. Разве невозможно установить конкретное значение приложения для AVMetadataCommonKeyCreator? Что на самом деле представляет этот ключ?

Ответы [ 2 ]

2 голосов
/ 28 октября 2012

У меня такие же проблемы около года назад. Я не видел метаданных, когда писал аудиофайл с помощью AVFoundation. Я думаю, что AVMetadataCommonKeyCreator не работает. Я не могу сейчас сказать, но это было так.

Я решаю эту проблему с помощью библиотеки C taglib http://taglib.github.com действительно легко создать эту библиотеку для iOS. Я думаю, что вы можете удалить некоторые файлы, если не можете скомпилировать их.

1 голос
/ 24 марта 2015

Я также хотел бы подтвердить, что AVMetadataCommonKeyCreator не будет сохранено в метаданных видеообъекта. Другие, которые я пробовал (AVMetadataCommonKeyTitle, AVMetadataCommonKeyDescription и т. Д.), Работают. Мой базовый SDK - iOS 8.2.

Есть что-то особенное в ключе создателя? Apple резервирует это для некоторого другого использования? Есть ли другие ключи, которые ограничены для нас (или просто не работают)?

(у меня не было такой роскоши, чтобы протестировать каждый из 23 AVMetadataCommonKeys ..)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...