视频录制后需要上传,但是录制视频要想压缩,有几个可以压缩的点:比特率、帧率、分辨率
比特率:单位像素所占的比特值
帧率:单位时间内的视频帧数
分辨率:图片所占的像素点的一个度量 w * h

这里我们在最低的比特率和分辨率的情况下(不改变清晰度),降低帧率也能压缩视频大小,只是视频卡顿了点

自定义丢帧:

下面一个刻度6个视频帧 ,1s(1000ms)假设有30帧 ’-‘代表一帧,’|‘代表刻度
目的:丢帧处理后1s(1000ms) 5帧
每个视频帧都有在视频中特定的位置,如果其后的视频帧丢失,就会拿当前展示的视频帧代替展示,知道有新的视频帧来替换,所以丢帧也就是适当的时间内取合适的帧,如下5个刻度代表1s,一共有30帧,要想丢帧至5帧/s,就要丢掉25帧,为了视频卡顿程度最低,我们间隔取帧的时间间隔不能太长,最好越均匀约好,结果:每一刻度内同一位置取帧,例如都取刻度内第一帧

|------|------|------|------|------|

|------|------|------|------|------|

但是录屏视频帧并不都是稳定的:例如当前iPhone6s及其以下设备所装iOS系统会针对性能进行优化:性能占用越高,录屏帧越低,例如:①录屏时高频操作手机,视频帧率就会降低;②录屏界面无变化时帧率会降低;
只有无操作或者低频操作的或者界面有变化的录屏帧率才越稳定,经测试iPhone6s的帧率变化范围大约为3帧/s ~ 30帧/s,普通操作的帧率在22帧/s 附近波动
只有iPhone7及其以上视频帧率稳定在30帧/s附近小幅波动
所以丢帧就行为就变成了不是绝对的稳定了,能够适配所有iPhone7及其以上手机的录屏视频丢帧后稳定在5帧/s,iPhone7以下只能在正常操作下在3~4帧/s
为了稳定帧率,我的处理就是取每一刻度的第一帧,不管此刻度有几帧,如果是均匀的,那丢帧后也是均匀的,如果不均匀,丢帧后就相对均匀

代码:

var appenedAgoSampleBuffer:CMSampleBuffer?//已经拼里面的前一帧var lastSameBuffer:CMSampleBuffer?var firstTime:Double = 0.0
 override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) {switch sampleBufferType {case RPSampleBufferType.video:if assetWriter.status == AVAssetWriter.Status.failed || assetWriter.status == AVAssetWriter.Status.completed || assetWriter.status == AVAssetWriter.Status.cancelled {print("assetWrite状态:\(assetWriter.status)")return}if assetWriter.status == AVAssetWriter.Status.unknown {//num = 0assetWriter.startWriting()assetWriter.startSession(atSourceTime: CMSampleBufferGetPresentationTimeStamp(sampleBuffer))print("AVAssetWriter.Status.unknown")}if assetWriter.status == AVAssetWriter.Status.writing {if videoInput.isReadyForMoreMediaData{print("AVAssetWriter.Status.writing")let position:CMTime = CMSampleBufferGetOutputPresentationTimeStamp(sampleBuffer) ;print("====================\(CMTimeGetSeconds(position))")var canAppend = falseif lastSameBuffer == nil {//第一帧canAppend = truelet firstPosition:CMTime = CMSampleBufferGetOutputPresentationTimeStamp(sampleBuffer);//第一帧的时间戳firstTime = CMTimeGetSeconds(firstPosition)*1000//第一帧的时间appenedAgoSampleBuffer = sampleBuffer}else{let appenedAgoPosition:CMTime = CMSampleBufferGetOutputPresentationTimeStamp(appenedAgoSampleBuffer!);//前一帧时间戳let time = CMTimeGetSeconds(position)*1000 - firstTime//当前帧和第一帧的时间差let appenedAgoTime = CMTimeGetSeconds(appenedAgoPosition)*1000 - firstTime//前一帧的时间if (Int(time)/200) > (Int(appenedAgoTime)/200) {canAppend = trueappenedAgoSampleBuffer = sampleBuffer}}if  canAppend {let success:Bool = videoInput.append(sampleBuffer)lastSameBuffer = sampleBufferif !success {print("AVAssetWriter.Status.faild")self.stopRecording()}print("appended")}}}breakcase RPSampleBufferType.audioApp:// Handle audio sample buffer for app audiobreakcase RPSampleBufferType.audioMic:// Handle audio sample buffer for mic audiobreak@unknown default:// Handle other sample buffer typesfatalError("Unknown type of sample buffer")}}

iOS 12+ ReplayKit 系统录屏(三) 丢帧压缩相关推荐

  1. iOS 12+ ReplayKit 系统录屏(一)

    最近做了新需求,实现系统录屏,网上资料少的可怜,可用的更是寥寥无几,终于爬完坑了,现在总结一下. 环境:iOS 12以上 + Swift ReplayKit 实现系统录屏,录制手机屏幕,可以在应用之间 ...

  2. iOS 12+ ReplayKit 系统录屏(二)

    这篇文章主要记录 AppGroup的使用 一.AppGroup的使用方法 轻量级的数据共享 使用UserDefaults 在Extension Terget里(或者同一Group里的其他App) le ...

  3. iOS 12.0+系统录屏(一)

    iOS在录屏功能是走过了长长的一段路,在其他平台尤其是直播平台日益火爆的推动下,iOS12.0终于开放在应用中唤起系统录屏权限给开发者.以下内容以iOS 12.0+为基础,不再讨论之前的版本. 理论准 ...

  4. ios 10 开发-录屏直播 ReplayKit Live 与 Broadcast UI/Upload Extension

    在 iOS 8 及以前,第三方 App 如果想要全局录屏,只能使用私有 API,详见非越狱后台录屏. 升级到 iOS 9 后,官方新增了 ReplayKit,并且禁用了录屏的私有 API.Replay ...

  5. iOS-Swift使用ReplayKit实现录屏功能

    iOS-Swift使用ReplayKit实现录屏功能 前段时间有碰到Android用户使用系统录屏发来的一些bug重现录像,iOS端不会用系统录屏的用户都是拍视频联系产品然后反馈给我们开发,这中间有的 ...

  6. 苹果xr黑屏转圈圈解决方法_苹果iPhone XR升级iOS 12.3后黑屏转圈圈怎么办?附解决办法...

    北京时间5月14日凌晨,苹果公司正式向iPhone 5S及以上机型推送了iOS 12.3正式版,本次更新包大小约在500MB左右,主要更新内容为支持启用[隔空播放2]的电视,根据更新介绍显示,&quo ...

  7. 基于JAVA线上竞赛训练系统录屏计算机毕业设计源码+系统+mysql数据库+lw文档+部署

    基于JAVA线上竞赛训练系统录屏计算机毕业设计源码+系统+mysql数据库+lw文档+部署 基于JAVA线上竞赛训练系统录屏计算机毕业设计源码+系统+mysql数据库+lw文档+部署 本源码技术栈: ...

  8. Win7电脑系统录屏功能使用教程分享

    Win7电脑系统录屏功能使用教程分享.电脑上其实不用下载也可以使用录制屏幕这个功能,很多用户不懂如何去开启这个功能的方法,如果你还没有学会自带录屏工具的使用方法,那么可以通过本文来进行学习. 操作步骤 ...

  9. android 屏幕录制方案,ShareREC for Android全系统录屏原理解析

    本文是Mob开发者平台技术副总监余勋杰基于MediaProjection实现Android全系统录屏功能的原理解析,包括了结合MediaRecorder和MediaCodec两套方案. 文 / 余勋杰 ...

最新文章

  1. SLAM++: SLAM at the Level of Objects
  2. HTML和JavaScript函数之间的关系
  3. JavaScript 初学者必看“箭头函数”
  4. 【转】Ubuntu 14.04.3上配置并成功编译Android 6.0 r1源码
  5. C# 获取并判断操作系统版本,解决Win10、 Windows Server 2012 R2 读取失败的方案
  6. 最大子序和:单调队列维护一个上升序列
  7. expect() php,Linux expect 的安装
  8. [渝粤教育] 西北大学 数据结构 参考 资料
  9. (十)nodejs循序渐进-高性能游戏服务器框架pomelo之介绍和安装篇
  10. enctype=multipart/form-data 文件上传
  11. Qt制作音乐播放器按钮
  12. 数学建模国赛论文latex代码汇总
  13. 2020最新安卓版本是多少_努比亚Z20安卓P版本刷机包(官方最新固件rom下载V2.24正式版)...
  14. 在vc中使用xtremetoolkit界面库-----安装及环境配置
  15. ESLint+Prettier+Vetur 统一Vue项目代码风格
  16. [Warning] anonymous type with no linkage used to declare variable with linkage
  17. SWI-Prolog特性
  18. TLM通信(transaction level modle)
  19. mysql--索引原理与慢查询优化
  20. 设计银行项目中的注册银行用户基本信息的类,包括账户卡号、姓名、身份证号、联系电话、家庭住址。

热门文章

  1. redis中的map存储大量数据会有什么问题
  2. 网络拓扑图怎么画 详细教程
  3. github errno 10054
  4. BeeWare打包安卓apk文件,Python高效开发安卓app
  5. (2)<select>标签与 select 语句
  6. 我不能一概而论,大学到底要不要考研?
  7. 银河麒麟高级服务器操作系统V10-系统管理员手册:01 基本系统配置
  8. (手势识别)基于opencv的手势识别框选(一)图像处理
  9. spss分析方法-调节效应
  10. 使用taglib指令在jsp页面导入要使用的jstl标签库