5 votes

Écrire des métadonnées dans ALAsset

Je développe une application vidéo pour iPhone. J'enregistre une vidéo et la sauvegarde dans le Camera Roll de l'iPhone en utilisant le framework AssetsLibrary. L'API que j'ai utilisée est :

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

Existe-t-il un moyen d'enregistrer les métadonnées personnalisées de la vidéo dans le Camera Roll à l'aide de ALAsset. Si cela n'est pas possible avec le cadre AssetsLibrary, est-il possible d'utiliser une autre méthode ? En fait, je souhaite écrire des détails sur mon application dans les métadonnées de la vidéo.

1voto

alex-i Points 3089

Depuis iOS 4+, il existe le cadre AVFoundation, qui vous permet également de lire/écrire des métadonnées depuis/vers des fichiers vidéo. Il n'y a que des clés spécifiques que vous pouvez utiliser pour ajouter des métadonnées en utilisant cette option, mais je ne pense pas que ce soit un problème.

Voici un petit exemple que vous pouvez utiliser pour ajouter un titre à vos vidéos (cependant, dans cet exemple, toutes les anciennes métadonnées sont supprimées) :

    // 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
}];

Ce document présente également quelques exemples : avmetadataeditor

0voto

Adam Freeman Points 86

Vous pouvez également définir les métadonnées dans le videoWriter de la manière suivante =>

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

videoWriter.metadata = metadata;

où videoWriter est de type AVAssetWriter

et lorsque vous arrêtez l'enregistrement, vous appelez =>

[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");
         }
     }];
 }];

0voto

holtmann Points 2680

Il n'existe pas de méthode officiellement reconnue pour ce faire.

Ce que vous pouvez faire : Stocker les informations que vous souhaitez sauvegarder dans une base de données distincte. L'inconvénient est que ces informations ne sont alors disponibles que dans votre application.

Qu'essayez-vous d'accomplir exactement ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X