4

わかりましたので、私は拘束されており、はっきりと考えるにはあまりにも長い間これを見つめてきました.

基本的に必要なのは、NSArray画像を取り込み、mp4 またはその他のビデオ形式をディスクに書き込むメソッドだけです。

ユーザーのジェスチャーなどを監視することについては心配していません。画像は既にディスク上に存在します。変換を行うだけです。

AVWriter などが必要であることを理解しています。

- (CVPixelBufferRef) pixelBufferFromCGImage: (CGImageRef) image
{
  NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,
                         [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey,
                         nil];
  CVPixelBufferRef pxbuffer = NULL;

  CVPixelBufferCreate(kCFAllocatorDefault, CGImageGetWidth(image),
                    CGImageGetHeight(image), kCVPixelFormatType_32ARGB, (CFDictionaryRef) options,
                    &pxbuffer);

  CVPixelBufferLockBaseAddress(pxbuffer, 0);
void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);

  CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
  CGContextRef context = CGBitmapContextCreate(pxdata, CGImageGetWidth(image),
                                             CGImageGetHeight(image), 8, 4*CGImageGetWidth(image), rgbColorSpace,
                                             kCGImageAlphaNoneSkipFirst);

  CGContextConcatCTM(context, CGAffineTransformMakeRotation(0));

//    CGAffineTransform flipVertical = CGAffineTransformMake(
//                                                           1, 0, 0, -1, 0, CGImageGetHeight(image)
//                                                           );
//    CGContextConcatCTM(context, flipVertical);



//    CGAffineTransform flipHorizontal = CGAffineTransformMake(
//                                                             -1.0, 0.0, 0.0, 1.0, CGImageGetWidth(image), 0.0
//                                                             );
//
//    CGContextConcatCTM(context, flipHorizontal);


  CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image),
                                       CGImageGetHeight(image)), image);
  CGColorSpaceRelease(rgbColorSpace);
  CGContextRelease(context);

  CVPixelBufferUnlockBaseAddress(pxbuffer, 0);

  return pxbuffer;
}

すべてを 1 つのきれいなヘルパーに入れる方法がわかりません。質問する前に、画像などからビデオを表示する方法を見てきましたが、UIImageView で画像を実行するだけでは、ここで探しているものではありません。これは App Store で合法である必要があるため、FFMPeg はオプションではありません。

何か考え/ガイダンスはありますか?

4

1 に答える 1

1

https://github.com/meslater/MSImageMovieEncoderは画像を H.264 にエンコードします。コンテキスト参照または CVPixelBufferRefs (サンプル コードはこちらを参照) として画像を提供する必要があります。

-(BOOL)nextFrameInCVPixelBuffer:(CVPixelBufferRef*)pixelBuf;

このメソッドを呼び出すたびに、バッファと YES が返されます。これ以上画像がない場合は NO を返し、ディスク上にムービーが見つかります。

詳細については、UIImage 配列をムービーとしてエクスポートするにはどうすればよいですか? を参照してください。(基本的に同じコードです)またはgithubファイルを読んでください。

于 2013-01-03T09:43:14.617 に答える