Запись метаданных в ALAsset - PullRequest
5 голосов
/ 22 апреля 2011

Я разрабатываю видео приложение для iPhone.Я записываю видео и сохраняю его в iPhone Camera Roll, используя инфраструктуру AssetsLibrary.API, который я использовал:

- (void)writeVideoAtPathToSavedPhotosAlbum:(NSURL *)videoPathURL 
  completionBlock:(ALAssetsLibraryWriteVideoCompletionBlock)completionBlock

Есть ли способ сохранить пользовательские метаданные видео в Camera Roll с помощью ALAsset.Если это невозможно с помощью инфраструктуры AssetsLibrary, это можно сделать с помощью другого метода.В основном я заинтересован в том, чтобы писать подробности о моем приложении как часть метаданных видео.

Ответы [ 3 ]

1 голос
/ 15 июня 2012

Начиная с iOS 4+, существует платформа AVFoundation, которая также позволяет читать / записывать метаданные из / в видеофайлы.Есть только определенные ключи, которые вы можете использовать для добавления метаданных с помощью этой опции, но я не думаю, что это будет проблемой.

Вот небольшой пример, который вы можете использовать, чтобы добавить заголовок к своим видео (однако в этом примере удаляются все старые метаданные):

    // prepare metadata (add title "title")
NSMutableArray *metadata = [NSMutableArray array];
AVMutableMetadataItem *mi = [AVMutableMetadataItem metadataItem];
mi.key = AVMetadataCommonKeyTitle;
mi.keySpace = AVMetadataKeySpaceCommon;
mi.value = @"title";
[metadata addObject:mi];

    // prepare video asset (SOME_URL can be an ALAsset url)
AVURLAsset *videoAsset = [[AVURLAsset alloc] initWithURL:SOME_URL options:nil];

    // prepare to export, without transcoding if possible
AVAssetExportSession *_videoExportSession = [[AVAssetExportSession alloc] initWithAsset:videoAsset presetName:AVAssetExportPresetPassthrough];
[videoAsset release];
_videoExportSession.outputURL = [NSURL fileURLWithPath:_outputPath];
_videoExportSession.outputFileType = AVFileTypeQuickTimeMovie;
_videoExportSession.metadata = metadata;
[_videoExportSession exportAsynchronouslyWithCompletionHandler:^{
    switch ([_videoExportSession status]) { 
        case AVAssetExportSessionStatusFailed:
            NSLog(@"Export failed: %@", [[_videoExportSession error] localizedDescription]);                
        case AVAssetExportSessionStatusCancelled:
            NSLog(@"Export canceled");
        default:
            break;
    }
    [_videoExportSession release]; _videoExportSession = nil;
    [self finishExport];  //in finishExport you can for example call writeVideoAtPathToSavedPhotosAlbum:completionBlock: to save the video from _videoExportSession.outputURL
}];

Здесь также приведены некоторые примеры: avmetadataeditor

0 голосов
/ 16 июня 2014

Вы также можете установить метаданные в videoWriter, например: =>

NSMutableArray *metadata = [NSMutableArray array];
AVMutableMetadataItem *mi = [AVMutableMetadataItem metadataItem];
mi.key = AVMetadataCommonKeyTitle;
mi.keySpace = AVMetadataKeySpaceCommon;
mi.value = @"title";
[metadata addObject:mi];

videoWriter.metadata = metadata;

, где videoWriter имеет тип AVAssetWriter

и затем, когда вы прекращаете запись, вы звоните =>

[videoWriter endSessionAtSourceTime:CMTimeMake(durationInMs, 1000)];
[videoWriter finishWritingWithCompletionHandler:^() {
    ALAssetsLibrary *assetsLib = [[ALAssetsLibrary alloc] init];
    [assetsLib writeVideoAtPathToSavedPhotosAlbum:videoUrl
   completionBlock:^(NSURL* assetURL, NSError* error) {
         if (error != nil) {
             NSLog( @"Video not saved");
         }
     }];
 }];
0 голосов
/ 08 мая 2011

Официально поддерживаемого способа сделать это не существует.

Что вы можете сделать: Сохраните информацию, которую вы хотите сохранить, в отдельной базе данных. Недостатком является то, что такая информация доступна только в вашем приложении.

Что именно вы пытаетесь достичь?

...