首页 > Unity3D频道 > 【Unity3D研究院之游戏开发】 > Unity3D研究院之IOS截屏 话筒录音 录制截屏视频保存沙盒(另类实现方法)(三十五)
2012
09-15

Unity3D研究院之IOS截屏 话筒录音 录制截屏视频保存沙盒(另类实现方法)(三十五)

         两周没有更新博客了,MOMO最近超忙各种加班进行中。。IOS + Android同时开发,激情的日子继续着,蛤蛤。昨天有个朋友打电话告诉我说它们的U3D项目遇到点棘手的难题,他们想在Unity3D中增加截屏录像录音的功能,并且还要能导出保存成.mp4的格式。据我所知Unity3D是没有截屏录像的功能,只有截屏图片的功能。有一段时间没有研究Unity3D的东西了,一时心里痒痒我决定那就好好研究研究,功夫不负有心人终于让我研究出来如何在Unity3D结合IOS前端录制截屏视频的功能了。首先我说说我研究实现的原理。1.截取屏幕每帧的图片,将截取的N张图片组成一个没有声音的视频.mp4文件。2.同时还需要录制手机听筒中的声音保存为.caf格式。3.最终将没有声音的视频和音频组合成一个全新的视频文件,保存在沙盒中即可。

        因为他们的Unity3D项目比较特殊,可以认为是在Unity3D游戏引擎之上搭建的IOS软件项目。Unity3D只负责显示一个3D的模型,至于UI部分全部都是由IOS的前台的OC代码实现的。这样就造成一个问题,OC的代码截图只有UI部分,U3D截图只有3D部分。为了解决这个问题截屏时我们需要把这两张图片合成为一张全新的图片。这里再说一下用苹果私有API截图是可以同时将UI部分U3D部分保存为一张图片,不过有可能APPStore不能审核通过所以大家还是老老实实用合并的方法来做。

OK下面MOMO来说代码的实现过程

首先在Unity中创建一个全新的工程,在创建一个立方体对象,为了方便看效果我们写一条脚本让这个立方体的对象一直自转,这样播放出来的视频看的会比较清楚喔。

Test.cs直接挂在立方体对象之上。代码比较简单我就不解释了。

 

 

然后我们将这个Unity3D工程导出成IOS的项目 。Unity会生成对应的XCODE工程。我们写一个全新的ViewController覆盖在U3D生成的OPGL viewController之上,用于写UI高级控件,接着打开APPControll.mm文件。

在如下方法的末尾处添加代码

如果你不是U3D项目请大家记得引入AVFoundation.formwork 和 MediaPlayer.framework ,因为U3D会自动将这两个fromWork生成出来

 

下面是具体的实现 ,核心的代码MOMO也是在网上学习老外的文章,最终将它们组合在了一起就完成了。研究了好几个小时,真实内牛满面啊~~~~  由于代码比较多,请大家一定要仔细阅读哦。。

 

如下图所示,高级控件的按钮属于UI部分,后面的立方体对象是U3D生成,并且立方体对象在一直的旋转。点击开始截屏按钮时OC 部分 和U3D会每一帧同时截屏,并且此时开始录音。点击结束截屏按钮时,程序先将OC和U3D截屏的图片每一帧两两的组合成一个新图片,然后生成没有声音的视频。 最后将没有声音的视频 和刚刚录制的音频组合成一个全新的视频存在沙盒中即可。

 

Unity3D研究院之IOS截屏 话筒录音 录制截屏视频保存沙盒(另类实现方法)(三十五) - 雨松MOMO程序研究院 - 1

 

此时我们看一下模拟器中的沙盒文件,”数字”.JPG就是OC截取的图片, “数字+U3D”.JPG就是U3D中截取的图片。Sound.caf就是录制的音频文件,veido.mp4 就是将连续的图片组合成的无声音视频文件,最后的outputVeido.mov就是将无声音的视频文件与音频文件组合成的新视频文件。

 

Unity3D研究院之IOS截屏 话筒录音 录制截屏视频保存沙盒(另类实现方法)(三十五) - 雨松MOMO程序研究院 - 2

 

双击打开outputVeido.mov视频文件,我们可以直接在QuickTimePlayer中播放它,怎么样功能很给力吧,哈哈哈。U3D也能轻松的实现截屏功能,哈哈哈~~

 

Unity3D研究院之IOS截屏 话筒录音 录制截屏视频保存沙盒(另类实现方法)(三十五) - 雨松MOMO程序研究院 - 3

 

最后我在说一下,这个代码同时也适用于IOS普通的软件项目中,U3D只是多做了一步合成图片的功能,所有代码都写在MyViewController中请大家仔细看喔。 这两天MOMO还会抽时间研究一下在Android 下如何截屏录制视频,请大家拭目以待噢,哇咔咔。因为U3D生成的工程比较大,所以我就不上传U3D生成的XCODE代码了,我给出一个纯OC代码的下载地址,最后雨松MOMO祝大家学习愉快。

下载地址:http://vdisk.weibo.com/s/cvQOT

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

--

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。

  1. MOMO大神您好,我想问一下:我现在可以实现录视频,但是没有声音,请问声音要怎么录制,因为是多平台开发,所以这个声音的录制不怎么适用,呵呵

  2. [a_compositionVideoTrack insertTimeRange:video_timeRange ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:nextClipStartTime error:nil];
    雨凇您好,这个demo,我在虚拟机上可以跑,但是在真机(ipad mini)上面每次运行到这一句就报错。求解?

  3. 菜鸟求问大神 什么叫做“我们写一个全新的ViewController覆盖在U3D生成的OPGL viewController之上,” ? 是删掉OPGL viewController? 还是怎么的? 求解答

  4. MOMO大神,你好,我想问一下想在U3D导出的web player版本中实现录像功能,可以吗,web版的好多dll都不能使用,不知道怎么办了,求指教啊

  5. momo我现在做的项目跟你说的这个基本一模一样,u3d只负责模型,其余界面都是android和ios来做,如果我想录制屏幕,有什么好的插件么?官方收购的everyplay没有视频保存的功能,难不成要单独一个平台做一个插件?是否可以将每帧的截图组合成视频呢?

  6. 你好,我现在也在做unity3d导出的ios录音应用,我自己的录音没有问题,但是加到unity3d导出的ios项目里面录音就不行了,你知道怎么回事吗

  7. 大神好,我在4s上面运行了你给我们下载的那个demo,跟你教程不一样,背景是绿色的,而且每次点击“结束截屏(开始录制视频)”之后程序就崩溃了。看不到图片。求助

  8. 请问录屏试过在横屏下录吗?导出效果是不是还是竖的?现在我遇到这个问题,就算用AVAssetWriterInput.transform也没有反应。求大神搭救。

  9. 大侠,我就是想知道Unity本身怎么能实现录视频的功能,网上有个截图的,但是怎么把截图整合成视频啊,不知道能不能用您帖子里的代码,因为IOS实在不懂啊,还求指教啊

  10. 大神在上,受小弟一拜!小弟想简单实现Unity场景的漫游时的视频录制,就是给漫游加个录视频的功能,敢问如何实现,这个IOS的太高端,看不太懂

  11. 大侠,羡慕哈~想当初学计算机就是想做自己理想中的游戏,结果到现在混了好几年的企业软件开发…业余关注游戏开发方面的东西,见到LZ的博客,收藏之~ 以后常来逛逛,顺便点点右边,嘻嘻~