SORU
18 EYLÜL 2010, CUMARTESİ


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
18 EYLÜL 2010, CUMARTESİ


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • David MeShow

    David MeShow

    10 EKİM 2006
  • iZAPPA

    iZAPPA

    16 Temmuz 2010
  • TomOdellVEVO

    TomOdellVEVO

    29 Mayıs 2012