Skip to content

Latest commit

 

History

History
75 lines (48 loc) · 3.85 KB

02.md

File metadata and controls

75 lines (48 loc) · 3.85 KB

2018.02

使用AVCaptureSession踩的一个坑

作者: Vong_HUST

最近遇到一个 bug,场景是这样的:

应用中有两个相机相关的页面,直播页和直播封面拍摄页(两个页面相机实例不是同一个),进入直播页时,设置了 preset1(16:9),点击进入封面拍摄,会使用 preset2(4:3)。如果直播页和封面拍摄页的摄像头位置一致,从封面拍摄页返回到直播页时,会导致相机输出的画面内容变形。后面断点查看,在摄像头位置一致的情况下,从封面拍摄页返回到直播页时,直播页 AVCaptureSessionpreset 变为了 AVCaptureSessionPresetInputPriority ,而不再是之前的设置的 preset1

通过官方文档以及 Google 出的资料,AVCaptureSessionPresetInputPriority 代表 capture session 不去控制音频与视频输出设置。而是通过已连接的捕获设备的 activeFormat 来反过来控制 capture session 的输出质量等级。放到我们上面的场景,也就是最终回到直播拍摄页时,preset 变成了封面拍摄时的 preset(即 4:3preset2 ),进而导致了输出画面变形。其实想想也对,设备全局是同一个摄像头,上一次的更改的参数值,应该是会被保留到下一次的,所以下一次在用之前最好做一次判断是否要重新设值。

解决方案就是每次相机页面 viewDidAppear 的时候判断一下 captureSessionpreset 和预设的值是否一致,不一致,再设回来即可。

以上,如有错误,欢迎指出,一起交流探讨。

参考链接:http://t.cn/R8fAZ37

用xcconfig配置BuildSettings

作者: 高老师很忙

当我们项目中有很多 Target,并且不同 Configurations 下的配置也不同的时候,直接配置 BuildSettings 是一件很痛苦的事情,这个时候就可以用 xcconfig 来解耦了。xcconfig 是用来保存 BuildSettings 键值对的纯文本文件,并且还可以共享公用的配置,在中大型项目中很是实用。

我们来举个简单栗子🌰吧,创建2个xcconfig文件,一个是Common.xcconfig(公共设置),一个是Debug.xcconfig(Debug的时候使用的),如图1;

如图2;

如图3;

这个时候我们去 Build Settings 里面去查看就可以看到我们写入的内容了,如图4。

编译源文件的流程

作者: 南峰子_老驴

来复习一下编译 Objective-C 源文件的过程吧。用下面的命令输出编译源文件的不同阶段:

clang -ccc-print-phases main.m

输出结果如下:

0: input, "main.m", objective-c
1: preprocessor, {0}, objective-c-cpp-output
2: compiler, {1}, ir
3: backend, {2}, assembler
4: assembler, {3}, object
5: linker, {4}, image
6: bind-arch, "x86_64", {5}, image

简单解释一下1-6的处理:

  1. 预处理:处理包括宏替换、头文件导入;
  2. 编译生成IR(中间代码):词法分析、生成AST、静态分析等,然后生成LLVM代码;
  3. 汇编器生成汇编代码;
  4. 汇编器将可读的汇编代码转换为机器代码;
  5. 将多个目标对象文件合并为一个可执行文件;
  6. 生成image文件,即最后的可执行文件;

参考

深入剖析 iOS 编译 Clang LLVM