Nasıl bir film olarak Uİİmage dizisi verme?
Ciddi bir sorunum var: UIImage
çeşitli nesnelerle NSArray
bir ben var. Ben şimdi yapmak istiyorum, ne o UIImages
film oluşturun. Ama bunun nasıl yapılacağı hakkında bir fikrin yok.
Biri bana yardım ya da bana istediğim gibi bir şey yok kod parçacığı göndermek umuyoruz.
Thx!
Edit: ileride - eğer video bozuk görünüyorsa çözüm uygulandıktan Sonra, yakalama görüntüleri/alanının genişliği 16'nın katları olduğundan emin olun. Mücadelenin birçok saat sonra buldum burada: Why does my movie from UIImages gets distorted?
İşte tam çözüm (sadece genişliği sağlamak 16 katı) http://codethink.no-ip.org/wordpress/archives/673
CEVAP
AVAssetWriter ve AVFoundation framework kalanında. Yazar dediğin sırayla video akışı için tek tek Kare eklemek sağlayan bir yöntem appendSampleBuffer: olarak adlandırılan AVAssetWriterInput, bir giriş vardır. Aslında gerekecek:
1) yazar Tel:
NSError *error = nil;
AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:
[NSURL fileURLWithPath:somePath] 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]; //retain should be removed if ARC
NSParameterAssert(writerInput);
NSParameterAssert([videoWriter canAddInput:writerInput]);
[videoWriter addInput:writerInput];
2) oturumu Başlatmak:
[videoWriter startWriting];
[videoWriter startSessionAtSourceTime:…] //use kCMTimeZero if unsure
3) bazı örnekler Yazma:
// Or you can use AVAssetWriterInputPixelBufferAdaptor.
// That lets you feed the writer input data from a CVPixelBuffer
// that’s quite easy to create from a CGImage.
[writerInput appendSampleBuffer:sampleBuffer];
4) oturumu Bitirmek:
[writerInput markAsFinished];
[videoWriter endSessionAtSourceTime:…]; //optional can call finishWriting without specifiying endTime
[videoWriter finishWriting]; //deprecated in ios6
/*
[videoWriter finishWritingWithCompletionHandler:...]; //ios 6.0
*/
Hala doldurmalı boşlukları bir sürü olacak, ama gerçekten sabit kalan tek parça CGImage
Bir: bir piksel tampon oluyor bence
- (CVPixelBufferRef) newPixelBufferFromCGImage: (CGImageRef) image
{
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, frameTransform);
CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image),
CGImageGetHeight(image)), image);
CGColorSpaceRelease(rgbColorSpace);
CGContextRelease(context);
CVPixelBufferUnlockBaseAddress(pxbuffer, 0);
return pxbuffer;
}
frameSize
CGSize
hedef çerçeve açıklayan bir boyutu frameTransform
Kare içine bunları çizerken görüntüleri dönüştürmek sağlar CGAffineTransform
.
Nasıl Uİİmage yatay olarak çevirmek iç...
Nasıl Javascript dizisi(JSON formatınd...
Nasıl Scala içinde bir bayt dizisi ola...
Nasıl dosyaları zaman uyumsuz olarak y...
Nasıl metin yatay ve dikey olarak Andr...