AVAssetWriter 硬编码bug解决
一、需求
直播助手在录屏过程中,产品要求跟随用户手机屏幕旋转,录屏的视频跟随旋转
二、实施方案
目前触手录,iTools PC端均已经实现该功能,并且该功能只适配iOS9和iOS10系统。猜测实现方案有两种方式:
1、Airplay协议升级,支持在用户旋转之后,系统发送过来的H264数据已经旋转,可能性比较小
2、系统发送过来的H264数据需要解码,然后手动根据屏幕方向,进行旋转。
1方式实施时间较长,暂时按照方案2来实施。2方案中需要感知用户屏幕的方向,注意这里的方向是渲染的朝向而不是重力朝向,渲染方向通过下面的方式获取

三、iOS9 硬编码的bug
iOS上面主要硬编码两种方式,一种VideoToolBox,一种AVAssetWriter;AVAssetWriter要求同一时刻只能存在一个对象在工作,否则在系统的log中可能会出现下面的警告
Sep 7 10:26:11 Administratorde-iPhone kernel[0] <Notice>: AVE: openGated (ID 8000 dev f8 (force f0)) with CL REGISTERED = 4 (clock 1)
Sep 7 10:26:11 Administratorde-iPhone kernel[0] <Notice>: H264SecurityCheck WARNING: m_NumberOfClients reached MAX 4
Sep 7 10:26:11 Administratorde-iPhone kernel[0] <Notice>: AVE WARNING: m_ClientsSecurityCheck->AddClient failed
并且AVAssetWriterInputPixelBufferAdaptor 在追加数据的时候,也会添加失败,导致无法再进行编码。
项目中参照VideoCore的硬编码代码存在缺陷
https://github.com/jgh-/VideoCore-Inactive/blob/master/transforms/iOS/H264Encode.h

该C++类的实现文件中第一个未采用ARC编译方式;第二个AVAssetWriter在指针转换过程中大量使用void*指针,导致AVAssetWriter在C++对象析构之后无法正常释放,产生无法再编码的bug
三、bug修复
将AVAssetWriter void*指针数组改为AVAssetWriter*指针,分成两个对象,让ARC控制对象的释放

AVAssetWriter 硬编码bug解决的更多相关文章
- ExpressionTree——让反射性能向硬编码看齐
缘起 最近又换了工作.然后开心是以后又能比较频繁的关注博客园了.办离职手续的这一个月梳理了下近一年自己写的东西,然后就有了此文以及附带的代码. 反射 关于反射,窃以为,他只是比较慢.在这个前提下,个人 ...
- maven构建项目时硬编码中文乱码问题解决
场景:1. 项目采用maven作为构建工具.2. 前端页面为jsp,由前端团队独立完成,添加编码配置:<%@ page contentType="text/html;charset=u ...
- 密码硬编码(Password Management: Hardcoded Password)
在对项目进行安全扫描时,发现一些密码硬编码问题,本文主要三个方面:1)什么是密码硬编码:2)密码硬编码的危害:3)密码硬编码的解决方案. 一 什么是密码硬编码 将密码以明文的形式直接写到代码中,就是密 ...
- SpringCloud系列二:硬编码实现简单的服务提供者与服务消费者
从本文开始,以一个电影售票系统为例讲解Spring Cloud 1. 版本 jdk:1.8 SpringBoot:2.0.0.RELEASE SpringCloud:Finchley.M8 2. 系统 ...
- Nvidia NVENC 硬编码预研总结
本篇博客记录NVENC硬编码的预研过程 github: https://github.com/MarkRepo/NvencEncoder 步骤如下: (1)环境搭建 (2)demo编译,测试,ARG ...
- 告别硬编码,mysql 如何实现按某字段的不同取值进行统计
上周我突然意识到,我在grafana上写的 sql 语句存在多处硬编码.这篇笔记将记录如何实现没有硬编码的sql语句,以及自学编程过程中如何应对自己的笨拙代码和难题不断的状况. 1.有效但粗笨的硬编码 ...
- Password Management:Hardcoded Password 密码管理:硬编码密码
- Fortify漏洞之Dynamic Code Evaluation: Code Injection(动态脚本注入)和 Password Management: Hardcoded Password(密码硬编码)
继续对Fortify的漏洞进行总结,本篇主要针对 Dynamic Code Evaluation: Code Injection(动态脚本注入) 和 Password Management: Har ...
- 告别硬编码,让你的POI导入导出拥抱变化
GitHub地址 | 博客 | 中文 | English | 原文链接 为什么使用AutoExcel? Excel导入导出在软件开发中非常常见,只要你接触过开发,就一定会遇到.相信很多人会跟我一样选择 ...
随机推荐
- Spring源码情操陶冶-AbstractApplicationContext#prepareBeanFactory
阅读源码有助于陶冶情操,本文承接Spring源码情操陶冶-AbstractApplicationContext#obtainFreshBeanFactory 瞧瞧官方注释 /** * Configur ...
- hash冲突随笔
一:hash表 也叫散列表,以key-value的形式存储数据,就是将需要存储的关键码值通过hash函数映射到表中的位置,可加快访问速度. 二:hash冲突 如果两个相同的关键码值通过hash函数映射 ...
- JVM学习笔记一:内存管理
参考资料 本文参考:<深入理解Java虚拟机>作者 周志明 知识产权归作者所有 走近java java组成部分:java语言.各平台虚拟机.Class文件结构.java api 类库.第三 ...
- Mybatis框架分析
摘要 本篇文章只是个人阅读mybatis源码总结的经验或者个人理解mybatis的基本轮廓,作为抛砖引玉的功能,希望对你有帮助,如果需要深入了解细节还需亲自去阅读源码. mybatis基本架构 myb ...
- 如何使用Androidstudio创建一个新项目
首先打开AS,然后 选择第一个选项Start a new Android Studio project 填写包名和项目名,点击next 选择项目类型,点击next 选择UI类型(都是死丢丢帮你生成的) ...
- swift UILabel多行显示时 计算UILable的高度(可用于UILable高度自适应)
代码如下 func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{ let label:UILabel = ...
- python进阶(3):模块和包
之前两天我们介绍了一些比较常用的模块,而我也说过会讲解什么是模块,今天我们就来分析分析模块和包,模块我们现阶段使用还可以而包的话现阶段我们基本很少会用到包,学的不是很清楚也没关系这些东西都是用的多了也 ...
- 如何开发自己的搜索帝国之Elasticsearch
搜索引擎是什么? 搜索引擎是指根据一定的策略.运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统.搜索引擎包括全文索引.目录索引 ...
- 关于Web.config的debug和release.config文件
使用Web.Config Transformation配置灵活的配置文件 发布Asp.net程序的时候,开发环境和发布环境的Web.Config往往不同,比如connectionstring等.如果常 ...
- MySQL之增_insert-replace
MySQL增删改查之增insert.replace 一.INSERT语句 带有values子句的insert语句,用于数据的增加 语法: INSERT [INTO] tbl_name[(col_nam ...