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;
}

我只是看不出如何将它全部放入一个干净的助手中。在你问之前我已经看到:如何从图像等中显示视频,但只是在 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 回答