Запись метаданных в ALAsset
Я разрабатываю видео приложение для iPhone. Я записываю видео и сохраняю его на iPhone Camera Roll, используя инфраструктуру AssetsLibrary. API, который я использовал, это:
- (void)writeVideoAtPathToSavedPhotosAlbum:(NSURL *)videoPathURL
completionBlock:(ALAssetsLibraryWriteVideoCompletionBlock)completionBlock
Есть ли способ сохранить пользовательские метаданные видео в Camera Roll с помощью ALAsset. Если это невозможно с помощью инфраструктуры AssetsLibrary, это можно сделать с помощью другого метода. В основном, я заинтересован в том, чтобы писать подробности о моем приложении как часть метаданных видео.
3 ответа
Начиная с 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
Официально поддерживаемого способа сделать это не существует.
Что вы можете сделать: сохранить информацию, которую вы хотите сохранить в отдельной базе данных. Недостатком является то, что такая информация доступна только в вашем приложении.
Что именно вы пытаетесь достичь?
Вы также можете установить метаданные в 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");
}
}];
}];