2011-12-13 9 views
1

iphoneで画像をビデオに変換しました(もちろん、スタックオーバーフローの質問からコードを取得しました)。しかし、問題は録画されたビデオの速度が非常に速いことです。私は約2250フレームありますが、2秒以内に逃げました。私は問題がそのフレームレートであることを知っています。 しかし、私は正しい方法を知らない。 私のコードはiphoneイメージからビデオへのビデオの問題のスピード

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectoryPath = [paths objectAtIndex:0]; 
NSString *myFilePath = [documentsDirectoryPath stringByAppendingPathComponent:@"test.mov"]; 

if ([self openVideoFile:myFilePath withSize:CGSizeMake (480.0, 320.0)]) { 
    for (int i=1; i<2226; i++) { 
     NSString *imagename=[NSString stringWithFormat:@"1 (%i).jpg",i]; 
     UIImage *image=[ UIImage imageNamed:imagename]; 
     [self writeImageToMovie:[image CGImage]]; 
    } 
    [videoWriter finishWriting]; 
} 
else { 
    NSLog(@"friled to open video file"); 
} 

このコードの下にあるCMTIME変数をどうするか

- (BOOL) openVideoFile: (NSString *) path withSize:(CGSize)imageSize { 
    CGSize size = CGSizeMake (480.0, 320.0);//imageSize; 

    NSError *error = nil; 
    videoWriter = [[AVAssetWriter alloc] initWithURL: 
        [NSURL fileURLWithPath:path] fileType:AVFileTypeQuickTimeMovie 
               error:&error]; 
    if (error != nil){ 
     NSLog(@"error>>>> %@",error); 
     return NO; 
    } 

    NSDictionary *videoCleanApertureSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
               [NSNumber numberWithDouble:size.width], AVVideoCleanApertureWidthKey, 
               [NSNumber numberWithDouble:size.height], AVVideoCleanApertureHeightKey, 
               [NSNumber numberWithInt:10], AVVideoCleanApertureHorizontalOffsetKey, 
               [NSNumber numberWithInt:10], AVVideoCleanApertureVerticalOffsetKey, 
               nil]; 


    NSDictionary *videoAspectRatioSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
               [NSNumber numberWithInt:1], AVVideoPixelAspectRatioHorizontalSpacingKey, 
               [NSNumber numberWithInt:1],AVVideoPixelAspectRatioVerticalSpacingKey, 
               nil]; 



    NSDictionary *codecSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
            videoCleanApertureSettings, AVVideoCleanApertureKey, 
            videoAspectRatioSettings, AVVideoPixelAspectRatioKey, 
            nil]; 

    NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
            AVVideoCodecH264, AVVideoCodecKey, 
            codecSettings,AVVideoCompressionPropertiesKey, 
            [NSNumber numberWithDouble:size.width], AVVideoWidthKey, 
            [NSNumber numberWithDouble:size.height], AVVideoHeightKey, 
            nil]; 
    writerInput = [[AVAssetWriterInput 
        assetWriterInputWithMediaType:AVMediaTypeVideo 
        outputSettings:videoSettings] retain]; 
    NSMutableDictionary * bufferAttributes = [[NSMutableDictionary alloc] init]; 
    [bufferAttributes setObject: [NSNumber numberWithInt: kCVPixelFormatType_32ARGB] 
         forKey: (NSString *) kCVPixelBufferPixelFormatTypeKey]; 
    [bufferAttributes setObject: [NSNumber numberWithInt: 480] 
         forKey: (NSString *) kCVPixelBufferWidthKey]; 
    [bufferAttributes setObject: [NSNumber numberWithInt: 320] 
         forKey: (NSString *) kCVPixelBufferHeightKey]; 


    adaptor = [[AVAssetWriterInputPixelBufferAdaptor 
       assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput 
       sourcePixelBufferAttributes:nil] retain]; 

    NSMutableDictionary*  attributes; 
    attributes = [NSMutableDictionary dictionary]; 

    int width = 480; 
    int height = 320; 

    [attributes setObject:[NSNumber numberWithInt:kCVPixelFormatType_32ARGB] forKey:(NSString*)kCVPixelBufferPixelFormatTypeKey]; 
    [attributes setObject:[NSNumber numberWithInt:width] forKey: (NSString*)kCVPixelBufferWidthKey]; 
    [attributes setObject:[NSNumber numberWithInt:height] forKey: (NSString*)kCVPixelBufferHeightKey]; 
    CVReturn theError = CVPixelBufferPoolCreate(kCFAllocatorDefault, NULL, (CFDictionaryRef) attributes, &pixelBufferPool);           


    NSParameterAssert(writerInput); 
    NSParameterAssert([videoWriter canAddInput:writerInput]); 
    [videoWriter addInput:writerInput]; 

    writerInput.expectsMediaDataInRealTime = YES; 
    [videoWriter startWriting]; 
    [videoWriter startSessionAtSourceTime:kCMTimeZero]; 

    buffer = NULL; 
    lastTime = kCMTimeZero; 
    presentTime = kCMTimeZero; 

    return YES; 
} 






    - (void) writeImageToMovie:(CGImageRef)image 
{ 
    if([writerInput isReadyForMoreMediaData]) 
    { 
     buffer = [self pixelBufferFromCGImage:image]; 
     BOOL success = [adaptor appendPixelBuffer:buffer withPresentationTime:presentTime]; 
     if (!success) NSLog(@"Failed to appendPixelBuffer"); 
     CVPixelBufferRelease(buffer); 

     presentTime = CMTimeAdd(lastTime, CMTimeMake(1, 1000));//I think problem is here but what will be given for correct output 
     lastTime = presentTime; 
    } 
    else 
    { 
     NSLog(@"error - writerInput not ready"); 
    } 
} 


    - (CVPixelBufferRef)pixelBufferFromCGImage:(CGImageRef)image 
{ 
    CGSize size = CGSizeMake (480.0, 320.0); 
    CVPixelBufferRef pxbuffer; 
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey, 
          [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey, 
          nil]; 
    if (pixelBufferPool == NULL) NSLog(@"pixelBufferPool is null!"); 
    CVReturn status = CVPixelBufferPoolCreatePixelBuffer (NULL, pixelBufferPool, &pxbuffer); 
    CVPixelBufferLockBaseAddress(pxbuffer, 0); 
    void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer); 

    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef context = CGBitmapContextCreate(pxdata, size.width, 
               size.height, 8, 4*size.width, rgbColorSpace, 
               kCGImageAlphaNoneSkipFirst); 
    CGContextConcatCTM(context, CGAffineTransformMakeRotation(0)); 
    CGContextDrawImage(context, CGRectMake(90, 10, CGImageGetWidth(image), 
              CGImageGetHeight(image)), image); 
    CGColorSpaceRelease(rgbColorSpace); 
    CGContextRelease(context); 

    CVPixelBufferUnlockBaseAddress(pxbuffer, 0); 

    return pxbuffer; 
} 

の下に与えられた関数や機能のdefenitionsを呼び出すにあり、どのようにすることができ、私は正しく 一つより多くの助けそれを作りましたこのビデオでどのようにオーディオを追加できますか?

+0

でビデオを作成する持っていたされ、私も問題が持っている私は、オーディオを取得することができない映像を生成することができていますが、 AVFoundation CoreMedia CoreVideoに

をこのライブラリを追加します。アプリがクラッシュしてログに何も表示されず、ビデオ画像にカラー画像が使用され、白い画像が使用されてもクラッシュしない場合にのみ発生します。 – Johnykutty

+0

これはデバイスで動作するようになっていますか? –

答えて

1

あなたのPTSは非常に近くにあります。 CMTimeMake(1, 1000)の代わりに、なぜ30FPS:CMTimeMake(1, 30))

0

私はあなたのコードを改訂して解決策を思いつきました。私の場合、私の視野内のすべての画像を0.1秒で記録するので、私のfpsは0.1fpsです。

presentTime = CMTimeAdd(lastTime, CMTimeMake(1, 10)); 

あなたの比率が1秒間に1000画像であるためにあなたのビデオが速すぎる理由。毎秒1画像にすることができます。

presentTime = CMTimeAdd(lastTime, CMTimeMake(1, 1)); 

これを試してみてください。

0

誰もがこのコードを使用して、オーディオ