案例本例有一个超过8G的mp4视频文件需要播放。最初的做法是直接将mp4手动拷贝到指定的安卓目录下然后利用MediaPlayer的OpenFile来打开对应路径的文件进行播放。好处在于app与mp4是互相独立的可以随时替换视频文件且apk文件大小不受视频文件的影响。需求视频文件是固定的不会变更但是需要防拷贝或拷贝后不能在非本应用内被正常播放。方案一将视频文件上传到云端通过OpenUrl进行在线播放。但因为需要支持离线播放因此该方案不做考虑。方案二还是通过app、mp4分离的方式但是对本地mp4文件进行加密UE端解密播放。这个是否可行需进一步研究若有朋友知晓希望评论分享交流方案三 (本例采取的方案)将视频文件直接打包进apk并做加密处理。需要解决的问题基于UE或安卓的打包特性对打包出来的包体大小有限制以及视频文件在UE打包出来后可以很轻松的通过反编译/解包等方式找到。本方案最终会涉及到apk、obb、pak三种类型包体文件具体后面会提到。目前有以下问题需要解决1. 视频文件过大导致打包失败2. 打包出来的mp4文件通过apk/obb解压后被找到3. 通过obb里的pak文件找到视频文件OBB解压找到pak文件pak通过UnrealPak.exe或其它工具解包找到mp4解决方案1. 解决文件过大导致打包失败问题从打包报错可以看出obb文件不能超过4G因此首先对8G多的视频文件做切割切割成单个不超过4G的文件我通过ffmpeg做的裁切ffmpeg-iinput.mp4-fsegment-segment_time350-reset_timestamps1-ccopy output%03d.mp4允许large、patch、overflow OBB以支持输出最大4G的OBB文件2. 不将视频文件直接暴露在OBB中启用pak、chunks为后续做自定义资源分包以及加密用不自动打包/拷贝视频文件可以禁止打包出来后视频直接以原格式mp4拷贝到包里又可以为后面将视频文件打包进pak而避免重复拷贝。添加打包非UE资源文件夹我将三个视频文件放在Content/Videos目录下,将其添加为非UE资源文件夹打包到包里到这里直接打包的话所有的文件都会被打包进默认的主pak文件该pak文件将会超过4G放不进OBB。因此还是设法将三个视频文件单独打包进不同的pak。UE 提供了两种相互独立的资源分包机制二者选其一即可不能混用方式一通过 DataAsset 配置 ChunkID 分包新建 DataAsset 并指定 ChunkID打包时 UE 会把该 DataAsset 所在目录下的所有资源包括同目录下的 mp4 等非 UE 资源自动归入对应的 pakchunk{ChunkID} 包中。这种方式是按目录维度整体划分资源无需逐文件指定。如上图配置 ChunkID10 后打包会生成 pakchunk10-Android_ASTC.pak 文件pakchunk10 中的 10 即对应上面配置的 ChunkID。方式二通过 DefaultPakFileRules.ini 按文件规则重定向在 Config 文件夹内新建 DefaultPakFileRules.ini通过文件通配规则把指定的文件或文件夹重定向到某个 pakchunk 中。这种方式是按文件粒度精确控制与 DataAsset 的 ChunkID 配置完全无关二者是两套独立的机制。[MoviesToPak10]OverridePakspakchunk10bOnlyChunkedBuildstrue;List offilemasks to apply to Files.../output000.mp4[MoviesToPak11]OverridePakspakchunk11bOnlyChunkedBuildstrue;List offilemasks to apply to Files.../output001.mp4[MoviesToPak12]OverridePakspakchunk12bOnlyChunkedBuildstrue;List offilemasks to apply to Files.../output002.mp4这个配置的意思是将指定的 output000.mp4 文件打包进 pakchunk10同理 output001.mp4、output002.mp4 分别打包进 pakchunk11、12 的 pak 文件里。本例采用方式二DefaultPakFileRules.ini将三个视频文件分别精确重定向到三个不同的 pakchunk 中。至此我们成功地将三个将近4G的mp4分别打进了3个不同pak文件这样pak再打进obb的时候就可以通过UE的自动分配打包到不同的OBB里避开了单个OBB文件不允许超过4G的限制。这也是需要允许large、patch、overflow OBB的原因。3.加密pak文件防止从pak中提取视频文件启用CryptoKeys插件加密配置加密后常规手段就无法破解pak包了。利用UE自带的加密方案是否有被破解的风险待进一步研究。请参考《UE4 Pak 加密与解密调研》打包文件中间文件打包过程文件在xxx\Saved\StagedBuilds\里查看。- 默认未启用Exclude movie files when staging就会将Movies中的视频文件默认拷贝到包里启用Exclude movie files when staging启用后就不会拷贝Movies文件夹了安装包最终输出的包如下总体大小为8、9G理论上最大可以支持总大小不超过12G的包。补充更正上面说可以支持总大小不超过12G的包的说法有误实际上可以支持大于12G甚至更大的文件只要单个切片不超过4G,都可能正常打包。注意overflow1.xxx.obb当overflow1放不下后还会生成overflow2.xxx.obb至于overflow.obb数是否有上限待验证。
