[✔️]在cocos2dx中播放视频方案调研

362 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情

cocos2dx 在Windows上并没有实现视频播放

可选方案

lib协议大小备注
FFMpegGPL/LGPLgithub download
OpenCVBSD5-6M任意使用,只能显示图形,不能显示声音
x264github
vlc优点:支持win、mac、Android,支持http等流媒体
缺点:Android包体16M,Windows 2M
教程
ljkPlayerbilibili基于ffmpeg开发,只支持Android,ios
ExoPlayerGoogle提供的Android视频播放器
优点:包小,只有1.1M
缺点:Android5.0之后Codec架构调整,ExoPlayer没有做过多的兼容,只适合简单的视频播放场景,只支持Android
CRI Sofdec成熟的商业视频中间件,首个平台授权11w,追加平台6w
theoraplayer基于ffmpeg搞的一个demo
libvpxBSD
Theora播放特定的格式因为是BSD协议,和H264是竞争关系,虽然现在不维护了,不过这也直接导致H264开源

FFMpeg GitHub Builds

5.1avcodec-59.dllavformat-59.dll
lgpl50M12.2M
gpl74M12.4M
4.4.3avcodec-58.dllavformat-58.dll
lgpl46M12.2M
gpl71M12.26M

以上的FFMpeg对应的dll都非常大,但是我在我的电脑上发现钉钉的软件也有使用FFMpeg,但是他们的avcodec.dll只有10M+。

经过后来自己的编译发现,如果在configure的配置中增加一些优化选项,的确是10M+,所以GitHub上的builds,大概率都是没有增加任何的优化选项,仓库编译的逻辑我也懒得看了。

编译文件大小

ffmpeg-filewin(lib/dll)android armv8-a (a/so)
avcodec58k/8.2M12.3M/7.42M
avfilter19k/2.03M3.74M/2.04M
avformat41k/1.64M3.87M/1.68M
avutil118k/473k490k/282K
swresample7k/165k114k/65K
swscal9k/456k478K/265K
总计249k/12.9M21M/11.7M

结果

我最终使用的FFMpeg v4.2.2,在GitHub上也找到了这种方案的开源代码,简单review了下代码,其原理是通过FFMpeg解析出视频每一帧的纹理数据,并存储在一个cache中,在使用的时候,通过update驱动frame的前进,然后不停的从cache中获取对应frame的纹理,然后渲染出来,其中decode的过程,作者使用了多线程。

音频作者并没有处理,需要后续自己补充上,具体效果后续同步下结果。