首页 > 代码库 > Unity 视频播放杂谈

Unity 视频播放杂谈

背景:

     游戏机中想加入舞蹈元素,最先的想法是开发舞蹈游戏,然后通过动画来表现舞蹈,给用户提供舞蹈教学方面的体验,但是舞蹈游戏本身的开发就需要很长的时间(就人太少),不用谈后续的舞蹈和音乐的版权啦,所以现在想走另外一条途径,在unity中播放舞蹈教学视频,加上UI和一些检测来实现舞蹈教学,而且这套框架写完之后,内容很容易扩展,毕竟不需要针对每个舞蹈设计动画。但是Unity中视频播放就是各种蛋疼,尤其是在android下面,OK ,下面的内容很多是从网上整理下来:

1 Win/Mac

首先,在Windows和Mac上 需要Quick Time7.0以上的版本。Unity支持的视频播放格式还是蛮多如.mov、.mpg、.mpeg、.mp4、.avi、.asf,甚至.H264等等,使用起来也很简单,真的很简~~单。
在WIN/MAC下,Unity提供了MovieTexture理,对导入的视频Unity会自动进行转换。MovieTexture继承与Texture类,提供了视频播放中需要的简单控制播放/暂停/停止:
Pause Pauses playing the movie.
Play Starts playing the movie.
Stop Stops playing the movie, and rewinds it to the beginning.
MovieTexture给出的参数也是在不多,考虑到视频会是从网络中进行下载,检测isReadyToPlay很有必要,isPlaying给出是否在播放的参数,loop控制是否循环播放,duration是一个很有用的东西,给出当前播放到的位置。
audioClip Returns the AudioClip belonging to the MovieTexture.
duration The time, in seconds, that the movie takes to play back completely.
isPlaying Returns whether the movie is playing or not.
isReadyToPlay If the movie is downloading from a web site, this returns if enough data has been downloaded so playback should be able to start without interruptions.
loop Set this to true to make the movie loop.
OK , 测试一下,具体的使用方式雨松给出的很详细:Unity3D研究之两种方式播放游戏视频。以在平面显示为例,测试代码的核心代码如下:
        renderer.material.mainTexture = movie;        movie.loop = true;        movie.Play();        movie.Pause();        movie.Stop();
 
clipboard
 
但是用完很不爽,因为不能满足项目需求,教学中肯定需要视频的 回放功能,快进、快退,定点播放等等。
对于快进,有网友通过与控制脚本在同一个GameObject上绑定一个AudioSource中pitch参数可以进行控制,但是我在测试中没有这种效果,可能方法不对吧,另外的方案就是寻求第三方插件
AVPro QuickTime。
这个插件可以实现快进、快退、顶点播放、多窗口播放等等(如果在window下,例子中是视频文件以及内部的参数中.bin的后缀要去掉),这个插件只能在win/mac上使用~~ ,        但是这个插件的代码是研究unity底层不错的例子哈。
clipboard[1]      clipboard[2] 

2 移动端
在移动端,unity并不提供MovieTexture,AVPro QuickTime也用不了,其最基本的显示方案使用通过PlayFullScreenMovie()函数进行全屏播放,根据其官网解释,主要有以下方面:
 (1)视频流直接从设备存储器中获得,所以文件只能是单独提供,视频文件放置在StreamingAssets 文件夹中
(2) 视频播放过陈中,unity将会停止;播放结束后unity自动恢复;播放过程中屏幕中的颜色会变为播放器的背景颜色,播放之后恢复。
 (3)在IOS中,内部实际上是调用MPMoviePlayerController的方法
(4)能够支持的格式: .mov, .mp4, .mpv, and .3gpH.264,MPEG-4 Part 2 video
 Handheld.PlayFullScreenMovie ("StarWars.mp4", Color.black, FullScreenMovieControlMode.CancelOnInput);
也就是说unity提供的方法更简单了,窗口方式也回避了,还是要去寻求第三方插件。

Mobile movie texture for android 
是个还算不错的,至少实际测试在android下是可以运行的,不过在unity4.5直接打开会有点问题,如果用unity4.1先打开再用4.5就没有问题,可能是资源问题。
clipboard[3]
这个插件使用开源视频编解码库Theora,所以他只能支持ogg格式的视频和音频,换句话说其他格式就要转换到 ogg格式,在运行中对视频进行解码然后通过unity GL底层库在相应的区域进行绘制。相对于AVPro QuickTime
这个插件提供的功能相对简单,不过这个很方面扩展,比较纠结的是提供的seek视频定点功能不是很完善,位置偏差较大,还不适合精确的应用。
2 总结
用来一天时间整理一下,整体说unity提供的视频功能还是很不理想,如果仅仅是播放游戏中的过场等等的还是足够的,但是对于现在的需求还不足够,希望unity能在这方面继续提升吧

Unity 视频播放杂谈