Créez une vidéo à partir d'un tableau de UIImages et enregistrez la vidéo dans la bibliothèque iPhone. AVAssetLibrary + AVFoundation
Problème dans l'enregistrement vidéo à l'iPhone de la Bibliothèque.
j'ai un tableau de UIImages,et deux boutons ,"convertToVideo"&"saveToiPhoneLib"
-(IBAction) convertToVideo { NSArray *chemins = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, OUI); NSString *documentsDirectory = ([chemins count] > 0) ? [les chemins de objectAtIndex:0] : néant; NSString *savedVideoPath = [documentsDirectory stringByAppendingPathComponent:@"videoOutput"]; printf(" \n\n\n-fichier Vidéo == %s--\n\n\n",[savedVideoPath UTF8String]); [auto writeImageAsMovie:imageArray toPath:savedVideoPath taille:auto.vue.cadre.taille durée:3]; } ici, je suis de passage le imageArray et savedVideoPath à la fonction ci-dessous -(void)writeImageAsMovie:(NSArray *)tableau toPath:(NSString*)taille:(CGSize)taille durée:(int)durée { NSError *erreur = nil; AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL: [NSURL fileURLWithPath:chemin] fileType:AVFileTypeQuickTimeMovie erreur:&erreur]; NSParameterAssert(videoWriter); NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys: AVVideoCodecH264, AVVideoCodecKey, [NSNumber numberWithInt:taille.largeur], AVVideoWidthKey, [NSNumber numberWithInt:taille.hauteur], AVVideoHeightKey, nil]; AVAssetWriterInput* writerInput = [[AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSettings] retain]; //NSDictionary *bufferAttributes = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:kCVPixelFormatType_32ARGB], kCVPixelBufferPixelFormatTypeKey, nil]; AVAssetWriterInputPixelBufferAdaptor *adaptateur = [AVAssetWriterInputPixelBufferAdaptor assetWriterInputPixelBufferAdaptorwithassetwriterinput:writerInput sourcePixelBufferAttributes:nil]; NSParameterAssert(writerInput); NSParameterAssert([videoWriter canAddInput:writerInput]); [videoWriter addInput:writerInput]; //Début de la session: [videoWriter startWriting]; [videoWriter startSessionAtSourceTime:kCMTimeZero]; CVPixelBufferRef buffer = NULL; //convertir uiimage à CGImage. tampon = [self pixelBufferFromCGImage:[[tableau objectAtIndex:0] CGImage]]; [adaptateur appendPixelBuffer:tampon withPresentationTime:kCMTimeZero]; //Écriture des échantillons: ...... //Fin de la session: [writerInput markAsFinished]; [videoWriter finishWriting]; } générer un CVPixelBufferRef ici - (CVPixelBufferRef) pixelBufferFromCGImage: (CGImageRef) de l'image { NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:OUI], kCVPixelBufferCGImageCompatibilitykey, [NSNumber numberWithBool:OUI], kCVPixelBufferCGBitmapContextCompatibilitykey, nil]; CVPixelBufferRef pxbuffer = NULL; CVReturn statut = CVPixelBufferCreate(kCFAllocatorDefault, de soi.vue.cadre.taille.largeur, auto.vue.cadre.taille.hauteur, kCVPixelFormatType_32ARGB, (CFDictionaryRef) options, &pxbuffer); NSParameterAssert(statut == kCVReturnSuccess && pxbuffer != NULL); CVPixelBufferLockBaseAddress(pxbuffer, 0); void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer); NSParameterAssert(pxdata != NULL); CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef contexte = CGBitmapContextCreate(pxdata, de soi.vue.cadre.taille.largeur, auto.vue.cadre.taille.de hauteur, 8, 4*la maîtrise de soi.vue.cadre.taille.largeur, rgbColorSpace, kCGImageAlphaNoneSkipFirst); NSParameterAssert(contexte); CGContextConcatCTM(contexte, CGAffineTransformMakeRotation(0)); CGContextDrawImage(contexte, CGRectMake(0, 0, CGImageGetWidth(image), CGImageGetHeight(image)), image); CGColorSpaceRelease(rgbColorSpace); CGContextRelease(contexte); CVPixelBufferUnlockBaseAddress(pxbuffer, 0); retour pxbuffer; }
d'économie à l'iPhone bibliothèque
-(IBAction) saveToiPhoneLib { NSArray *chemins = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, OUI); NSString *basePath = ([chemins count] > 0) ? [les chemins de objectAtIndex:0] : néant; NSString *getImagePath = [basePath stringByAppendingPathComponent:@"videoOutput"]; printf(" \n\n\n-fichier Vidéo == %s--\n\n\n",[getImagePath UTF8String]); UISaveVideoAtPathToSavedPhotosAlbum ( getImagePath,auto, @selector(vidéo:didFinishSavingWithError: contextInfo:), nil); } - (void) vidéo: (NSString *) videoPath didFinishSavingWithError: (NSError *) erreur contextInfo: (void *) contextInfo { NSLog(@"Terminé d'enregistrer de la vidéo avec l'erreur: %@", erreur); }
mais tout en économisant je m obtenir message d'erreur:-
Terminé l'enregistrement de la vidéo avec l'erreur: Erreur de Domaine=ALAssetsLibraryErrorDomain Code=-3302 "données non valides" UserInfo=0x1d59f0 {NSLocalizedFailureReason=Il y a eu un problème d'écriture de cet actif parce que les données n'est pas valide et ne peut pas être vu ou joué., NSLocalizedRecoverySuggestion=Essayer avec des données différentes, NSLocalizedDescription=données non valides}
s'il vous plaît laissez-moi savoir mon erreur. merci d'avance
source d'informationauteur aToz
Vous devez vous connecter pour publier un commentaire.
Utiliser le code ci-Dessous
Qui est tout simplement trop de code pour vérifier les erreurs. Assurez-vous que vous pouvez commencer l'exportation de la session, que vous avez vraiment obtenir pixel tampons pour vos images, que l'auteur est prêt pour recevoir plus de données que la mémoire tampon est ajoutée sans erreurs, que l'exportation de la session se termine avec succès et que le film de sortie de fichier existe et contient certaines données. Seulement alors vous pouvez essayer de l'enregistrer dans le système de l'album photo. Vérifier que toutes les informations d'erreur le long du chemin afin que vous sachiez où la chose se brise pour la première fois. (Autre chose, c'est que vous êtes tout simplement le code depuis le web et le coller ensemble, ce qui est tout simplement pas d'aller travailler pour AV de programmation.)
Oui, j'ai eu le même message d'erreur:
Mais seulement sur simulateur, quand j'ai couru sur un appareil, l'enregistrer dans la bibliothèque de photos a très bien fonctionné.