我有一个严重的问题:我有 NSArray
有几个 UIImage
对象 . 我现在想做的是从那些 UIImages
创建电影 . 但我不知道该怎么做 .
我希望有人可以帮助我或给我一个代码片段,它可以做我喜欢的事情 .
Edit: 供将来参考 - 应用解决方案后,如果视频看起来失真,请确保您捕获的图像/区域的宽度是16的倍数 . 经过多个小时的努力后发现:
Why does my movie from UIImages gets distorted?
这是完整的解决方案(只需确保宽度为16的倍数)
http://codethink.no-ip.org/wordpress/archives/673
9 回答
看看AVAssetWriter以及AVFoundation framework的其余部分 . 编写器有一个AVAssetWriterInput类型的输入,后者又有一个名为appendSampleBuffer:的方法,可以将单个帧添加到视频流中 . 基本上你必须:
1) Wire the writer:
2) Start a session:
3) Write some samples:
4) Finish the session:
你仍然需要填写很多空白,但我认为唯一真正困难的部分是从
CGImage
获取一个像素缓冲区:frameSize
是描述目标帧大小的CGSize
,而frameTransform
是CGAffineTransform
,可让您在将图像绘制到帧中时对其进行变换 .Here is the latest working code on iOS8 in Objective-C.
我们不得不对@ Zoul上面的答案进行各种调整,以使其适用于最新版本的Xcode和iOS8 . 这是我们的完整工作代码,它采用一组UIImages,将它们转换为.mov文件,将其保存到临时目录,然后将其移动到相机胶卷 . 我们汇集了来自多个不同帖子的代码以实现这一目标 . 我们已经强调了我们必须解决的陷阱,以便在我们的评论中使用代码 .
(1) Create a collection of UIImages
这是创建AssetWriter并向其添加图像以进行写入的主要方法 .
(2) Wire up an AVAssetWriter
(3) Start a writing Session (注意:方法从上面继续)
(4) Finish the Session (注:方法从上面继续)
(5) Convert your UIImages to a CVPixelBufferRef
此方法将为您提供AssetWriter所需的CV像素缓冲区引用 . 这是从您从UIImage(上图)获得的CGImageRef获得的 .
(6) Move Your Video to the Camera Roll 由于AVAssetWriter无法直接写入相机胶卷,因此会将视频从"tmp/temp.mov"(或您上面命名的任何文件名)移动到相机胶卷 .
Zoul上面的答案给出了你将要做的很好的概述 . 我们广泛地评论了这段代码,以便您可以看到它是如何使用工作代码完成的 .
NOTE: This is a Swift 2.1 solution (iOS8+, XCode 7.2) .
上周我开始编写iOS代码来生成图像视频 . 我有一点AVFoundation经验,但从未听说过CVPixelBuffer . 我在这个页面上看到了答案,也是here . 花了好几天的时间来剖析一切,并以一种对我的大脑有意义的方式将它们全部重新组合在Swift中 . 以下是我提出的建议 .
注意:如果您将下面的所有代码复制/粘贴到单个Swift文件中,它应该编译 . 你只需要调整
loadImages()
和RenderSettings
值 .第1部分:进行设置
在这里,我将所有与导出相关的设置分组到一个
RenderSettings
结构中 .第2部分:ImageAnimator
ImageAnimator
类了解您的图像并使用VideoWriter
类来执行渲染 . 这个想法是将视频内容代码与低级AVFoundation代码分开 . 我还在这里添加了saveToLibrary()
作为类函数,它在链的末尾被调用以将视频保存到照片库 .第3部分:VideoWriter
VideoWriter
类完成了所有AVFoundation的繁重工作 . 它主要是AVAssetWriter
和AVAssetWriterInput
的包装 . 它还包含由我编写的花哨代码,它知道如何将图像转换为CVPixelBuffer
.第4部分:实现目标
一切就绪后,这些是你的3条魔术线:
我采用了Zoul的主要思想,并整合了AVAssetWriterInputPixelBufferAdaptor方法,并开始构建一些小框架 .
随意检查并改进它! CEMovieMaker
这是在iOS 8上测试的Swift 2.x版本 . 它结合了来自@Scott Raposa和@Praxiteles的答案以及来自@acj的代码,为另一个问题做出了贡献 . 来自@acj的代码在这里:https://gist.github.com/acj/6ae90aa1ebb8cad6b47b . @TimBull也提供了代码 .
就像@Scott Raposa一样,我从来没有听说过
CVPixelBufferPoolCreatePixelBuffer
和其他几个功能,更不用说了解如何使用它们 .您在下面看到的内容主要是通过反复试验和阅读Apple文档拼凑而成 . 请谨慎使用,并在出现错误时提供建议 .
用法:
码:
这是swift3版本如何将Images数组转换为Video
我将它与屏幕截图一起使用,基本上创建了一个屏幕截图视频,这里是the full story/complete example .
刚刚将@Scott Raposa的答案翻译成了swift3(有一些变化很小):
好吧,这有点难以在纯Objective-C中实现....如果你正在为越狱设备开发,一个好主意是从你的应用程序内部使用命令行工具ffmpeg . 使用如下命令从图像创建电影非常容易:
请注意,图像必须按顺序命名,并且也可以放在同一目录中 . 有关更多信息,请查看:http://electron.mit.edu/~gsteele/ffmpeg/
使用AVAssetWriter将图像写为电影 . 我已在这里回答: - https://stackoverflow.com/a/19166876/1582217