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