Android 云游戏实现
公司最近有和云游戏相关的业务,最开始采用的是virtualdisplay +mediacodec实现,屏幕视频录制编码推流。但是mediacodec编码有很多参数设置不了,而且云主机的cpu性能完完全全高于GPU 所以,就准备采用软件编码实现。基于X264+minicap实现也可以理解为把bitmap转为H264视频通过RTMP传输。
先上流程图:
1 minicap :是一个高速的截图工具,具体如何安装使用可以查看github上的流程
2 数据解析:minicap提供了一个localsocket往外吐数据我们可以在Android端解析该数据,关键代码如下
private void getMinicapData() {new Thread(new Runnable() {@Overridepublic void run() {try {mMinicapClientSocket.connect(mAddr);InputStream inputStream = mMinicapClientSocket.getInputStream();long start = System.currentTimeMillis();while (isLiving) {byte[] buffer = new byte[FRAME_SIZE];int realLen = inputStream.read(buffer);if (buffer.length != realLen) {buffer = subByteArray(buffer, 0, realLen);}int len = buffer.length;for (int cursor = 0; cursor < len; ) {int byte10 = buffer[cursor] & 0xff;if (readBannerBytes < bannerLength) {cursor = parserBanner(cursor, byte10);} else if (readFrameBytes < 4) {// 第二次的缓冲区中前4位数字和为frame的缓冲区大小frameBodyLength += (byte10 << (readFrameBytes * 8)) >>> 0;cursor += 1;readFrameBytes += 1;Log.i(TAG, "解析图片大小 = " + readFrameBytes);} else {if (len - cursor >= frameBodyLength) {Log.i(TAG, "frameBodyLength = " + frameBodyLength);byte[] subByte = subByteArray(buffer, cursor,cursor + frameBodyLength);frameBody = byteMerger(frameBody, subByte);if ((frameBody[0] != -1) || frameBody[1] != -40) {Log.i(TAG, String.format("Frame body does not start with JPG header"));return;}final byte[] finalBytes = subByteArray(frameBody, 0, frameBody.length);// 转化成bitmapmBitmap = BitmapFactory.decodeByteArray(finalBytes, 0, finalBytes.length);// 这里开始推送mLivePusher.native_push_video(miniCapRGBChange.getYUVByBitmap(mBitmap));long current = System.currentTimeMillis();Log.i(TAG, "图片已生成,耗时: "+ TimeUtil.formatElapsedTime(current- start));start = current;cursor += frameBodyLength;restore();} else {Log.i(TAG, "所需数据大小 : " + frameBodyLength);byte[] subByte = subByteArray(buffer, cursor, len);frameBody = byteMerger(frameBody, subByte);frameBodyLength -= (len - cursor);readFrameBytes += (len - cursor);cursor = len;}}}}} catch (Exception e) {Log.i(TAG, String.format(" get mini data Exception"+e));}}}).start();}
3 .android 移植x264
x264是一个免费的开源库,可以移植到Android上来,具体可查看官网或者网上搜索如何移植。
编码参数关键代码
void VideoChannel::setVideoEncodeInfo(int width, int height, int fps, int bitrate) {// 编码参数设置可以参考//https://www.cnblogs.com/wainiwann/p/5647521.htmlpthread_mutex_lock(&mutex);mWidth = width;mHeight = height;mFps = fps;mBitrate = bitrate;ySize = width * height;uvSize = ySize / 4;if (videoCodec) {x264_encoder_close(videoCodec);videoCodec = 0;}if (pic_in) {x264_picture_clean(pic_in);delete pic_in;pic_in = 0;}//打开x264解码器//x264解码器的属性x264_param_t param;//ultrafast 最快//zerolatency 无延迟解码x264_param_default_preset(¶m, "ultrafast", "zerolatency");param.i_level_idc = 30;//输入数据格式 int csp=X264_CSP_BGR|X264_CSP_VFLIP; //这个格式是BITMAP的那种颠倒的BGR的格式param.i_csp = X264_CSP_I420;param.i_width = width;param.i_height = height;//无b帧param.i_bframe = 0;//参数i_rc_method表示码率控制, CQP(恒定质量) CRF(恒定码率) ABR(平均码率)param.rc.i_rc_method = X264_RC_CRF;//码率(比特率 单位Kbps)param.rc.i_bitrate = bitrate / 1000;LOGI("set_i_bitrate------------------>%d",bitrate/1000);//瞬时最大码率param.rc.i_vbv_max_bitrate = bitrate / 1000 * 1.2;//设置了i_vbv_max_bitrate必须设置此参数, 码率控制区大小 单位kbpsparam.rc.i_vbv_buffer_size = bitrate / 1000;//帧率param.i_fps_num = fps;param.i_fps_den = 1;param.i_timebase_den = param.i_fps_num;param.i_timebase_num = param.i_fps_den;//用fps而不是时间戳来计算帧间距离param.b_vfr_input = 0;//帧距离(关键帧) 2s一个关键帧param.i_keyint_max = fps * 2;//是否赋值sps和pps放在每个关键帧的前面 该参数设置是让每个关键帧(I帧)都附带sps/ppsparam.b_repeat_headers = 1;//多线程param.i_threads = 1;x264_param_apply_profile(¶m, "baseline");
// x264_param_apply_profile(¶m, "high");//打开解码器videoCodec = x264_encoder_open(¶m);pic_in = new x264_picture_t;x264_picture_alloc(pic_in, X264_CSP_I420, width, height);pthread_mutex_unlock(&mutex);
}
4 rtmp移植 :网上教程比较多可自行参考。
5最后效果图:
时间来不及就先看看图片吧。
老版本的屏幕录制可以看看上一篇文章,新版的屏幕录制需要搭好minicap环境,有些9.0手机可能不能允许minicap,如果是手机的话还是建议采用上一篇文章的方案,如果是自己要做这方面的业务可以采用新版本。 新版本的可以等我后面放到github上。
Android 云游戏实现相关推荐
- 云游戏、VR、AI,云计算给元宇宙提供了哪些想象力?
2021 最火的新概念,莫过于元宇宙.2021 年 10 月 29 日,Facebook 宣布改名 Meta:2021 年 11 月 1 日,"元宇宙第一股" Roblox ...
- access游戏库不显示 ea_英伟达上线云游戏服务 千款游戏月费4.99美元
2月5日,全球知名人工智能计算公司英伟达宣布推出自己的云游戏服务GeForce Now,该服务包含了1000款游戏,定价月费4.99美元,90天内限时推出了该服务的免费试用体验. 5G时代来临,随 ...
- 《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——2.8节本章小结
本节书摘来自异步社区<Android 3D游戏开发技术宝典--OpenGL ES 2.0>一书中的第2章,第2.8节本章小结,作者 吴亚峰,更多章节内容可以访问云栖社区"异步社区 ...
- 边缘计算助力云游戏成为5G时代的杀手级应用
作者:王超 引言 随着技术.架构以及商业模式的快速发展和完善,边缘计算作为一种成熟的计算范型已经得到广泛应用.边缘计算是为应用开发者和服务提供商在网络的边缘侧提供云服务和IT环境服务,"边缘 ...
- 赠书 | 云游戏搭上 5G 快车,华为、腾讯争相布局
作者 | 林瑞杰 冯林 温向东 陈乐 等 来源 | 大数据DT 头图 | 下载于ICphoto 伴随 5G 网络的部署和商用进程,云游戏作为 5G 技术在消费互联网领域的重要应用,受到了资本和社会的广 ...
- 2020 年,云游戏将爆发?各大科技公司云游戏布局大曝光!
作者 | 年素清 责编 | 伍杏玲 出品 | CSDN云计算(ID:CSDNcloud) 伴随5G技术加速落地,云游戏作为5G应用落地的最佳场景,已经成为全球游戏厂商和云服务厂商布局的重要战场.根据艾 ...
- 《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——2.4节文件I/O
本节书摘来自异步社区<Android 3D游戏开发技术宝典--OpenGL ES 2.0>一书中的第2章,第2.4节文件I/O,作者 吴亚峰,更多章节内容可以访问云栖社区"异步社 ...
- 腾讯、字节跳动展开拉锯战;网易云音乐称酷狗抄袭;谷歌不再开发云游戏 | 极客头条...
「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 丁恩华 出品 | CSDN(ID:CSDNnews ...
- 基于 SPICE 协议的硬编推流整合方案在云游戏中的应用
背景 随着虚拟化技术如模拟器,容器化等技术等发展,在安卓云游戏/云手机场景中,可以在服务宿主侧虚拟出更多更小颗粒度的 Android 实例.其中比较核心的技术是图形虚拟化技术,如何最大限度利用宿主侧的 ...
最新文章
- 如何定位EXC_BAD_ACCESS错误 (info malloc-history)
- ngrok 内网穿透
- Matlab 图像处理相关函数命令
- 批量PDF转换成Office文件 PDF转换器下载
- HTTP状态码对照表(全部状态_建议收藏)
- Java堆栈的应用2----------中缀表达式转为后缀表达式的计算Java实现
- 解决python连接mysql,UTF-8乱码问题
- 在ASP.NET Core 2.0中创建Web API
- go使用互斥锁实现协程同步
- Mac下虚拟机使用那些事儿
- 微信开发者工具下载使用
- SVN 无法提交 svn: Can't open file '/svn/ssq/db/txn-current-lock': Permission denied
- 【知识兔】2022年9月份计算机一级开始报名啦+考试资料
- 微信中怎样查看微信热点?分享技巧!微信中如何查看微信热点?
- 如何提升自己的打字速度?
- 【作业】第一章课后作业
- 如何让店铺快速靠前排名
- 去软件培训学校真的可以学到东西吗?(不看你会后悔)
- python技术介绍_Python介绍
- git 切换仓库地址