IOS远程控制技术当中,最重要的环节是视频的输出,本文就目前出现的几种IOS视频流技术做一个实践和对比,重点会放在比较这几个方案在性能上的优缺点。

方案分析

IOS视频流方案,目前可以想到的有以下三种:

  1. 通过截屏获取图片,转换成视频流的形式,这种方法可见于facebook研发的WebDriverAgent(WDA)[1]技术,后由Appium进行维护,通过WDA的MJPEG服务接口获取屏幕截图,再用web-socket发送到浏览器端,就可以视觉上形成视频的效果。

  2. Apple自带的开发组件,获取视频流,比如屏幕音视频录制可以使用Apple开发组件:AirPlay、ReplayKit框架等。

  3. 使用MAC本身的QUICKTIME对IOS设备进行录制,这种方式需要通过程序来启用QUICKTIME。

实践和对比

这里根据几个开源项目,做一个不同技术方案的视频流效果对比。

为方便比较,展示视频流的应用架构基本一致,不同之处在于使用哪种方式去获取视频流,程序架构图如下:

1080×381 24.2 KB

流程图

1. WebDriverAgent MJPEG 图片服务器

这里我们用开源项目STF[2] 来观察WDA图片服务视频流的效果。我们部署了一套STF在机器上,通过手机的秒表来记录视频流的延迟,结果是大概延迟200毫秒左右,点击有肉眼可见的卡顿。缺点是WDA服务启动过程略长,同时功能上不支持音频服务。

结果示意图如下:

1080×646 401 KB

2. Replay kit 视频流

Apple开发组件replay kit[3] 经常用于直播当中,可以实时的获取视频流,它是通过IOS内置的录制视频组件,在苹果手机上启动一个视频输出的服务,再从此端口获取视频流。优点是传输快,缺点是由于使用了本身的录屏功能,因此对苹果硬件损耗大,手机容易发热,使用它做IOS视频流输出时,无法再使用直播APP。我们使用将replay kit录屏方式,服务端使用python的socket方法接收视频流,展示在前端,做了个简单的程序,验证了下效果,延迟大概100-200ms之间。

- (void)processSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType {@synchronized(self) {switch (sampleBufferType) {case RPSampleBufferTypeVideo:// Handle video sample bufferif (!CMSampleBufferIsValid(sampleBuffer)){return;}if (tempVideoTimeStamp && (CFAbsoluteTimeGetCurrent() - tempVideoTimeStamp < 0.01)){NSLog(@"load frame...");}else{[imageHandler pushOneFrame:sampleBuffer];tempVideoTimeStamp = CFAbsoluteTimeGetCurrent();}break;case RPSampleBufferTypeAudioApp:// Handle audio sample buffer for app audiobreak;case RPSampleBufferTypeAudioMic:// Handle audio sample buffer for mic audiobreak;default:break;}}

结果示意图如下:

1080×673 371 KB

3. Qvh视频流

QVH[4]通过使用MAC QUICKTIME组件,进行屏幕录制视频,是目前github上的开源项目,这款技术理论上可以用在MAC,LINUX上,可以独立实现录制屏幕。该技术可以继续加入音频。我们使用web-socket技术,把qvh输出的视频流展示出来,得到的结果是延迟略高,我们再来看下qvh本身的延迟,大概有200毫秒,如下图:

996×567 324 KB

通过web-socket转到前端后,延迟在200-700ms之间,假如用于IOS真机远程控制,用户体验上面可能会遇到一些瓶颈。

结果示意图如下:

892×679 374 KB

结论

从几个开源项目浅谈IOS视频流输出方案相关推荐

  1. iOS实录15:浅谈iOS Crash

    导语:在当前的iOS开发中,虽然ARC为开发者解决了手动内存管理时代 的许多麻烦,但是内存方面的问题依然是产生iOS Crash的元凶之一,本文介绍内存方面,有关僵尸对象.野指针.内存泄漏.废弃内存这 ...

  2. 浅谈iOS和Android后台实时消息推送的原理和区别

    http://www.52im.net/thread-286-1-1.html 前言 iOS和Android上的实时消息推送差异很大,往小了说是技术实现的差异,往大了说是系统实现理念的不同.实时消息推 ...

  3. 透过湖工项目浅谈项目管理过程

    透过湖工教务项目浅谈项目管理过程   1.项目背景介绍: 湖工项目是湖北工业大学教务系统,是一种专注于大学和高等院校的教务管理系统.其中包括一些校园基本信息管理,教学培训计划管理,学生排课系统,成绩管 ...

  4. 开源GIS浅谈 【转】

    http://blog.csdn.net/happyduoduo1/article/details/51773850 谈到GIS软件,首先让我们想到的是GIS界的龙头大哥ESRI公司旗下的ArcGIS ...

  5. 浅谈iOS视频播放的N种解决方案

    header.jpeg 前言 虽然我不同意你的观点 但我誓死捍卫你说话的权利!--伏尔泰 很长时间没有写文章了,这个题目其实我很早就想动笔写了,因为从我第一个完整的APP项目开始,几乎每一个APP都有 ...

  6. js架构设计模式——由项目浅谈JS中MVVM模式

    1.    背景 最近项目原因使用了durandal.js和knockout.js,颇有受益.决定写一个比较浅显的总结. 之前一直在用SpringMVC框架写后台,前台是用JSP+JS+标签库,算是很 ...

  7. 华山论剑之浅谈iOS的生产线 工厂模式

    工厂模式是一种快速创建大量对象的模式.简单易上手,今天我就谈一下我对工厂模式的理解.工厂模式的核心思想就是继承.子类继承父类的方法并且重写父类方法.下面我们就看一下实际中是如何使用工厂模式的. *** ...

  8. 由项目浅谈JS中MVVM模式

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.    背景 最近项目原因使用了durandal.js和knock ...

  9. 浅谈iOS中关于app的优化

    目录 我要给出的建议将分为三个不同的等级: 入门级. 中级和进阶级: 入门级(这是些你一定会经常用在你app开发中的建议) 1. 用ARC管理内存 2. 在正确的地方使用reuseIdentifier ...

最新文章

  1. WPF中获取鼠标相对于桌面位置
  2. Expected BEGIN_OBJECT but was BEGIN_ARRARY at line 1 column 2 path$异常解决方法
  3. jenkins的历史
  4. java array 元素的位置_java中的两种排序工具Arrays和Collections的使用
  5. [渝粤教育] 西南石油大学 建设法规 参考 资料
  6. 文件的输入/输出操作
  7. 实现一个压缩Remoting传输数据的Sink:CompressionSink (转载)
  8. linux 设备驱动总结,linux设备驱动归纳总结(三):3面向对象思想和lseek
  9. [Android]使用Dagger 2依赖注入 - DI介绍(翻译)
  10. Blazor验证控件
  11. python 统计英文词频
  12. 使用git上传项目到github
  13. Pytorch CUDA GPU运算模型训练缓慢的一个可能原因
  14. mysql Slave_IO_Running:NO(解决方法)
  15. 【读书笔记】100个Switf必备tips
  16. python降维方法_python大战机器学习——数据降维
  17. POJ 3061  Subsequence   尺取法   挑战146页
  18. 二次bootloader关于boot28.asm应用的注意事项,28035的
  19. 微信小程序云数据库调用模板
  20. 局部边缘保持滤波(LEP)高动态范围图像HDR压缩 matlab程序(二)

热门文章

  1. Solr(1):Solr概述
  2. wcopy nfc pro智能读卡工具软件_手机NFC复制小区用的门禁卡
  3. [C/C++]gtest+mockcpp,修改mockcpp以支持C++中类成员函数的mock
  4. 081200计算机科学与技术——408计算机学科专业基础——操作系统,知识点整理【更新中】
  5. 推特群推掀开营销新篇章
  6. javascript内置对象API
  7. 【预测模型】偏最小二乘回归模型
  8. 跨链技术的分析和思考
  9. AD21改捕捉栅格大小
  10. js 获取复选框选中的值