Comment créer une vidéo à partir de ses cadres iPhone
J'avais fait de la R&D et a obtenu des succès dans la façon d'obtenir des images en termes d'images à partir de fichiers vidéo joué dans MPMoviePlayerController
.
Obtenu toutes les images de ce code, et enregistrer toutes les images dans un Tableau.
for(int i= 1; i <= moviePlayerController.duration; i++)
{
UIImage *img = [moviePlayerController thumbnailImageAtTime:i timeOption:MPMovieTimeOptionNearestKeyFrame];
[arrImages addObject:img];
}
Maintenant la question est que, Après le changement de certains fichier image, comme l'ajout d'émotions pour les images et l'ajout de filtres, tels que; film réel, en noir et blanc, Comment pouvons-nous créer une vidéo à nouveau, et de stocker le même vidéo dans le répertoire de documents avec la même cadence et sans perte de qualité de la vidéo.
Après la modification de certaines images que j'avais fait à la suite du code pour enregistrer la vidéo à nouveau.
- (void) writeImagesAsMovie:(NSString*)path
{
NSError *error = nil;
UIImage *first = [arrImages objectAtIndex:0];
CGSize frameSize = first.size;
AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:
[NSURL fileURLWithPath:path] fileType:AVFileTypeQuickTimeMovie
error:&error];
NSParameterAssert(videoWriter);
NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
AVVideoCodecH264, AVVideoCodecKey,
[NSNumber numberWithInt:640], AVVideoWidthKey,
[NSNumber numberWithInt:480], AVVideoHeightKey,
nil];
AVAssetWriterInput* writerInput = [[AVAssetWriterInput
assetWriterInputWithMediaType:AVMediaTypeVideo
outputSettings:videoSettings] retain];
AVAssetWriterInputPixelBufferAdaptor *adaptor = [AVAssetWriterInputPixelBufferAdaptor
assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput
sourcePixelBufferAttributes:nil];
NSParameterAssert(writerInput);
NSParameterAssert([videoWriter canAddInput:writerInput]);
[videoWriter addInput:writerInput];
[videoWriter startWriting];
[videoWriter startSessionAtSourceTime:kCMTimeZero];
int frameCount = 0;
CVPixelBufferRef buffer = NULL;
for(UIImage *img in arrImages)
{
buffer = [self newPixelBufferFromCGImage:[img CGImage] andFrameSize:frameSize];
if (adaptor.assetWriterInput.readyForMoreMediaData)
{
CMTime frameTime = CMTimeMake(frameCount,(int32_t) kRecordingFPS);
[adaptor appendPixelBuffer:buffer withPresentationTime:frameTime];
if(buffer)
CVBufferRelease(buffer);
}
frameCount++;
}
[writerInput markAsFinished];
[videoWriter finishWriting];
}
- (CVPixelBufferRef) newPixelBufferFromCGImage: (CGImageRef) image andFrameSize:(CGSize)frameSize
{
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,
[NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey,
nil];
CVPixelBufferRef pxbuffer = NULL;
CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, frameSize.width,
frameSize.height, kCVPixelFormatType_32ARGB, (CFDictionaryRef) options,
&pxbuffer);
NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);
CVPixelBufferLockBaseAddress(pxbuffer, 0);
void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
NSParameterAssert(pxdata != NULL);
CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(pxdata, frameSize.width,
frameSize.height, 8, 4*frameSize.width, rgbColorSpace,
kCGImageAlphaNoneSkipFirst);
NSParameterAssert(context);
CGContextConcatCTM(context, CGAffineTransformMakeRotation(0));
CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image),
CGImageGetHeight(image)), image);
CGColorSpaceRelease(rgbColorSpace);
CGContextRelease(context);
CVPixelBufferUnlockBaseAddress(pxbuffer, 0);
return pxbuffer;
}
Je suis nouveau dans ce sujet, donc merci de m'aider à résoudre cette question.
Avez-vous une solution pour cela ? Pouvez-vous s'il vous plaît poster la solution si possible ?
pourquoi vous voulez convertir la vidéo à nouveau? utiliser uniquement des images...
OriginalL'auteur Mehul Mistri | 2012-05-18
Vous devez vous connecter pour publier un commentaire.
Vous pouvez vous référer aux liens suivants espère que vous obtenir de l'aide :-
http://www.iphonedevsdk.com/forum/iphone-sdk-development-advanced-discussion/77999-make-video-nsarray-uiimages.html
À l'aide de la bibliothèque FFMPEG avec le SDK iPhone pour l'encodage vidéo
SDK de l'Iphone,Créer une Vidéo à partir UIImage
iOS de Montage Vidéo - Est-il possible de fusionner côte à côte (pas l'un après l'autre) deux fichiers vidéo en un seul à l'aide de l'iOS 4 AVFoundation classes?
OriginalL'auteur Maulik
Vous avez besoin pour obtenir des images pour chaque image, l'écran qui rend. J'ai utilisé
UIGetScreenImage()
privée de l'API à faire de même. et écrire ces images en tant que Film à l'aide deAVAssetWriter
.J'ai écrit un wrapper de faire le nécessaire avec juste quelques lignes de codes, essayez ce composant open source de référence:
https://www.cocoacontrols.com/controls/iqprojectvideo
Vous aurez sûrement à ne pas charger de votre projet à l'AppStore avec cette bibliothèque. C'est uniquement pour l'enregistrement de la vidéo à partir de screenschots. Suffit d'utiliser et de le jeter. Alors pourquoi API privée ne doit pas être utilisé?
OriginalL'auteur Mohd Iftekhar Qurashi