一、实现目标

  iOS11.0以上设备通过USB线连接电脑,在电脑端实时看到手机屏幕内容

  画质达到超清720级别,码率可达到1Mbps以上

二、实现技术方案设计

  1、手机端采用ReplayKit2框架,在Upload Extension 进程中采集到屏幕内容YUV和系统声音PCM+麦克风声音PCM

- (void)processSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType {switch (sampleBufferType) {case RPSampleBufferTypeVideo:break;case RPSampleBufferTypeAudioApp:break;case RPSampleBufferTypeAudioMic:break;default:break;}
}

  2、考虑在在Upload Extension 进程中或者主App进程中对图像和声音进行编码,编码成H264+AAC ,然后封装为FLV格式的包,利用RTMP协议进行推流

    因为目前已经存在一套推流的接口,所以考虑在PC端增加RTMP收流服务,进行解析视频流,然后渲染

  3、在PC端建立RTMP收流服务端,解码,渲染;目前OBS已经存在相关模块

三、遇到的问题以及解决方案

  1、如果在局域网中,目前的基础上,无线推流到PC和推流到远程直播服务器流程基本一样

  2、如何规避局域网的网络抖动环境,实现高清推流?局域网可能因为多人使用导致带宽分配原因,以及信道干扰原因导致上行速率达不到标称要求

    采用有线方案可以解决这个问题,那么手机如何利用USB线传递数据?

  3、USB传递有线数据有两种方案:

    第一种是MIFI认证,使用iOS外设通信的库,ExternalAccessory

    第二种是通过iproxy , 在PC端执行"iproxy pcport mobileport"的方式实现端口转发,PC上连接pcport会连接到手机的mobileport,当一条TCP连接建立成功之后手机就可以利用USB线和PC实现双向通信了

    这里为什么不能像安卓一样,实现正向的转发,将手机的端口转发到PC上呢?这就是iOS系统相对封闭的原因;

    猜测安卓连接USB线的时候,PC端执行命令会在手机端出发操作实现端口转发规则;而iOS不行

  那么最终采用的是第二种方案。

四、推流SDK协议改造

  对于采用的第二种方案,实施的时候遇到两个问题?

  第一个如何实现由PC主动连接手机的过程,连接手机的哪个端口?

    对于这个问题,这里解决方案是,第一个在socket上面设置套接字为REUSE相关的属性,保证端口能够重复绑定成功,这里假定这个1397端口只有这个程序使用

                   第二个是在有线投屏的时候,手机要先扫码得到PC的一个key,手机在启动一个TCP监听后将端口号联系这个key一起发给我们的后台,后台通过push或者pc pull的方式,将这个信息通知到PC端,也就是建立信道的方式

  第二个问题,如何在一个RTMP.c的主动发起连接中,修改原有的方式,先尝试被动连接(先启动一个同步阻塞的监听socket等待PC连接)。在这个逻辑中,因为等待过程是阻塞的,必然涉及到延时,在这里遇到了坑

    我们希望在 tcp socket bind一个端口,然后listen,然后accept的时候,希望在accept这个方法实现超时逻辑,最开始是这样实现的

 int ret = ::setsockopt(m_nRealServerSocket, SOL_SOCKET, SO_RCVTIMEO, (const char*) &tv, sizeof(tv));LOGW("socket accept start 1, set timeout ret = %d", ret);ret = ::setsockopt(m_nRealServerSocket, SOL_SOCKET, SO_SNDTIMEO, (const char*) &tv, sizeof(tv));

    上述的代码在安卓和PC上面生效,但是在iOS平台上面无效,虽然设置了一个超时时间,但是这个超时永远不会触发,accept永久阻塞

    为了规避这个问题,我采用select监听文件描述符的方式,select跨平台兼容性效果更好

    采用以下代码实现accept超时逻辑:

        int fd = -1;fd_set fdflag;sockaddr_in client_addr;memset(&client_addr, 0, sizeof(client_addr));FD_ZERO(&fdflag);FD_SET(m_nRealServerSocket, &fdflag);LOGW("socket accept start, timeout = %d secs", tv.tv_sec);bool hasProcessConnect = false;if(!hasProcessConnect && select(m_nRealServerSocket + 1, &fdflag, NULL, NULL, &tv) > 0){hasProcessConnect = true;fd = accept(m_nRealServerSocket, (struct sockaddr*)NULL, NULL);}// 一次事件触发之后, 清理监控的描述符FD_ZERO(&fdflag);

五、最终效果

ReplayKit2 有线投屏项目总结相关推荐

  1. ReplayKit2 有线投屏项目-反向Socket实现

    一.需求 我们在使用RTMP协议进行推流的时候,底层仍然采用的是TCP协议或者QUICK协议,有客户端主动发起请求.但是在有线投屏中,需要PC端向手机发起请求建立连接 二.实现 在客户端主动发起请求之 ...

  2. 安卓Android/苹果iOS USB有线投屏原理和实现

    USB有线投屏 有线镜像投屏简介 iOS 有线镜像投屏原理 1. 启动投屏 2. 接收数据 3. 关闭投屏 Android 有线镜像投屏原理 使用 ADB 镜像投屏 使用 USBAccessory 镜 ...

  3. 手机怎样投屏到电脑_手机有线投屏到Windows电脑

    将iPhone手机或者安卓手机屏幕投影到电脑的方法中,使用的最多的是无线投屏,对于iPhone手机即是使用airPlay,即屏幕镜像的方式.使用这种方式有一个特点,就是必须保证手机和电脑要处在同一Wi ...

  4. 安卓获取手机网络强度_USB调试和USB网络共享,安卓有线投屏究竟选哪个?

    用过EZCast投屏设备的安卓手机E粉,可能有过这样的困惑. 「开启USB调试」和「开启USB网络共享」 究竟选哪个进行有线同屏? 今天的小E课堂中,我将带大家看看这两者的区别,以及应该用哪个比较好. ...

  5. 手机有线投屏到Windows电脑

    将iPhone手机或者安卓手机屏幕投影到电脑的方法中,使用的最多的是无线投屏,对于iPhone手机即是使用airPlay,即屏幕镜像的方式.使用这种方式有一个特点,就是必须保证手机和电脑要处在同一Wi ...

  6. 关于华为matepad是否支持有线投屏的疑问解答

    以我所了解到的 华为MatePad 11英寸 MatePad Pro10.8英寸 matepad pro12.6英寸 2021款 华为matepad 10.8英寸 matepad pro10.8英寸  ...

  7. 局域网屏幕共享_USB调试和USB网络共享,安卓有线投屏究竟选哪个?

    用过EZCast投屏设备的安卓手机E粉,可能有过这样的困惑. 「开启USB调试」和「开启USB网络共享」 究竟选哪个进行有线同屏? 今天的小E课堂中,我将带大家看看这两者的区别,以及应该用哪个比较好. ...

  8. Android有线投屏实践

    家里有一台老式的投影仪,没有无线连接功能,只能通过HDMI线和VGA线传输数据.投影的时候需要使用电脑,但平常的使用,手机用起来更方便,曾考虑买一个无线接收装置,用来进行无线投屏,但是这样性能似乎不是 ...

  9. 安卓(调试)有线投屏、wifi投屏到电脑笔记

    一.准备工具 1.下载安装最新adb工具(相当于连接安卓的驱动程序) 下载地址:http://adbdownload.com/ 文件本来是免安装的. 只要加入具体操作系统环境变量即可: Ubuntu升 ...

最新文章

  1. 转:项目报告应该汇报什么内容?
  2. python transformer category_Python 生成VOC格式的标签实例
  3. python pil_使用Python的PIL模块来进行图片对比
  4. linux c icmp协议 判断主机存活
  5. OpenglES2.0 Android:画矩形
  6. stm32启动文件ld md hd cl vl xl分析及选择
  7. linux支持表情的字体,让应用程序支持emoji字符
  8. php采集分页数据,如何通过php+wordpress实现分页获取数据
  9. matplotlib画图设置线条透明度
  10. sublime3使用笔记
  11. 树链剖分边权模板spoj375
  12. editplus 打开大文件_CorelDRAW文件损坏的几种解决方法
  13. 51单片机对直流电机的控制
  14. 记一次Win7连接XP共享打印机
  15. matlab仿真高斯脉冲,高斯脉冲comsol仿真
  16. word文档页眉清除和页码设置
  17. 用的上的商学课1-50课学习笔记
  18. drain open 线与_【转】open-drain与push-pull
  19. h5页面可以获取安卓和ios平台,可获取手机类型,但是不能获取手机型号
  20. 虚拟摄像头/无人直播效果分析,可替抖音/微信

热门文章

  1. layui 使用xm-select实现下拉框多选
  2. DISK:Learning local features with policy gradient
  3. MaxCompute数据导入导出
  4. Word2Vec原理及代码
  5. ServiceHot 带你盘点全球 SaaS 50强企业
  6. css的ID选择器和class选择器的区别
  7. DELPHI XE 10.3开发安卓APP的经过
  8. javascript:_最佳JavaScript资源收藏:2020版
  9. 利用js实现简单抽奖功能
  10. python自动化框架学习路线