GameAnywhere 是一个开源的云游戏平台,由 Chun-Ying Huang 在2013年开发,最开始是毕业论文研究使用,近期随着云游戏风口正盛,这个项目关注度又有起色,本文介绍GameAnywhere代码构成。GameAnywhere 的License为 BSD3,可以修改代码后闭源,但是项目依赖的开源组件较多,需要注意 License。
代码构成
目录结构
├─bin
│ ├─config
│ │ └─common
│ ├─data
│ ├─log
│ └─mod
├─deps.pkg.win32 #依赖组件的windows包
│ ├─bin
│ ├─NvCodec
│ └─NVENC
├─deps.posix #依赖组件的unix包
│ └─lib
├─deps.src #依赖组件的源码
│ └─patches
├─deps.win32 #依赖组件的Windows头文件与库
│ ├─bin
│ ├─include
│ │ ├─include
│ │ ├─lib
│ │ ├─libavcodec
│ │ ├─libavdevice
│ │ ├─libavfilter
│ │ ├─libavformat
│ │ ├─libavutil
│ │ ├─libpostproc
│ │ ├─libswresample
│ │ ├─libswscale
│ │ ├─live555
│ │ ├─NVENC
│ │ └─SDL2
│ └─lib
├─docs
└─ga
├─android # android客户端
├─client # windows客户端
├─core # 公共依赖部分
├─module # 各个功能模块
│ ├─asource-system # apple 平台的音频抓取
│ ├─ctrl-sdl # 键盘输入
│ ├─encoder-audio # 音频编码
│ ├─encoder-mfx
│ ├─encoder-nvenc # NVIDIA 硬编码
│ ├─encoder-video # FFmpeg 软编码
│ ├─encoder-x264 # 编码x264库
│ ├─filter-rgb2yuv # rgb转yuv库,编码前预处理
│ ├─server-ffmpeg # FFmpeg库
│ ├─server-live555 # live555 项目,承载 rtsp 协议
│ └─vsource-desktop # DirectX GDI 抓图
├─server
│ ├─event-driven # 键盘鼠标输入windows平台实现
│ ├─event-posix # 键盘鼠标输入posix平台实现
│ └─periodic # 可执行文件 Main 函数,依赖 ga/core
└─vs2010 #Visual Studio工程
├─BasicUsageEnvironment
├─CloudGameDM_Installer
├─encoder-nvenc
├─ga-client
├─ga-hook
├─ga-server-event-driven
├─ga-server-periodic
├─groupsock
├─ipch
├─libga
├─liveMedia
├─module-asource-system
├─module-ctrl-sdl
├─module-encoder-audio
├─module-encoder-video
├─module-encoder-x264
├─module-filter-rgb2yuv
├─module-server-ffmpeg
├─module-server-live555
├─module-vsource-desktop
├─module-vsource-desktop-d3d
├─module-vsource-desktop-dfm
└─UsageEnvironment
服务端
Main: server\ga\server\periodic\ga-server-periodic.cpp
Server 端的功能:图像采集、图像预处理、声音采集、键盘输入、音视频编码、封包、传输功能,这些功能分别由对应GameAnywhere定义的模块实现。
//
if (load_modules() < 0) {
write_log("error, load_modules error ! \n");
return -1;
}
if (init_modules() < 0) {
write_log("error, init_modules error ! \n");
return -1;
}
if (run_modules() < 0) {
write_log("error, run_modules error ! \n");
return -1;
}
GameAnywhere 模块类型定义: server\ga\core\ga-module.h
/**
* Enumeration for types of a module.
*/
enum ga_module_types {
GA_MODULE_TYPE_NULL = 0, /**< Not used */
GA_MODULE_TYPE_CONTROL, /**< Is a controller module */
GA_MODULE_TYPE_ASOURCE, /**< Is an audio source module */
GA_MODULE_TYPE_VSOURCE, /**< Is an video source module */
GA_MODULE_TYPE_FILTER, /**< Is a filter module */
GA_MODULE_TYPE_AENCODER, /**< Is an audio encoder module */
GA_MODULE_TYPE_VENCODER, /**< Is a video encoder module */
GA_MODULE_TYPE_ADECODER, /**< Is an audio decoder module */
GA_MODULE_TYPE_VDECODER, /**< Is a video decoder module */
GA_MODULE_TYPE_SERVER /**< Is a server module */
};
GameAnywhere 模块定义: server\ga\core\ga-module.h
/**
* Data strucure to represent a module.
*/
typedef struct ga_module_s {
HMODULE handle; /**< Handle to a module */
int type; /**< Type of the module */
char *name; /**< Name of the module */
char *mimetype; /**< MIME-type o