安装 FFmpeg根据 官方文档 的描述,有三种安装 FFmpeg 的方式,这里我们选择最简单快速的一种,使用 Homebrew 命令安装。
如果还没有安装 Homebrew 的话,请先安装 Homebrew,点击跳转官方网站
我们执行如下命令即可安装好 FFmpeg:
1brew install ffmpeg
Xcode 相关配置Build Settings我们通过如下命令即可查看 FFmpeg 的相关信息
1brew info ffmpeg
会输出类似下面一样的信息
1234567891011121314151617ffmpeg: stable 4.4 (bottled), HEADPlay, record, convert, and stream audio and videohttps://ffmpeg.org//usr/local/Cellar/ffmpeg/4.4_2 (276 files, 52.7MB) * Poured from bottle on 2021-06-25 at 00:50:35From: https://github.com/Homebrew ...
Building for iOS Simulator, but the embedded framework ‘xxx.framework’ was built for iOS + iOS Simulator.
升级 Xcode 后就悲剧了,以上报错苹果在 Xcode 11 中已经给出 warring,在 Xcode 12.3 版本后会直接 error。
来自苹果工程师的回复:
This framework isn’t built with a supported configuration – iOS and iOS Simulator code has never been supported in the same binary. The linker in Xcode 11 began identifying these incorrect configurations and issuing warnings, and Xcode 12 goes further in identifying these issues.
The only correct way to r ...
工作日志
未读今天在项目中遇到了一个有趣的问题。项目中有一个监听的服务,监听需要将控制器放入一个数组中为其进行相应的操作。不过这引发了一个循环引用的问题。那么问题就变成了,如何在数组中存储弱引用呢?
数组中存储弱引用我们可以有两种解决方式:
设置一个类来存储我们的控制器,这个类的中用于存储的属性自然是 weak 类型。
使用 NSPointerArray。
使用自定义类存储控制器123456class WeakObject<T: AnyObject> { weak var value: T? init(value: T) { self.value = value }}
这样我们就不会出现相互持有的情况。详细代码如下:
123456789101112131415161718192021222324252627282930313233343536373839class DemoViewController: UIViewController { let manager = ControllerManager() ...
工作日志
未读今天在工作中遇到了需要让 AVPlayerLayer 支持 autolayout 的问题。因为我播放器的 playerView 是通过约束决定大小的,目的为了适应小屏手机。我需要让我的 AVPlayerLayer 充满我的 playerView,如果有 autolayout 这个问题就非常好解决,但是 layer 是不支持 autolayout 的,我想到了两种解决方式。
方法一:自定义 PlayerView 继承自 UIView,然后重写 layoutSubviews 方法,让 layoutSubviews 去执行一个回调 layoutCallback,我们在这个回调中调整 playerLayer 的 frame。
代码大致如下:
12345678910111213141516171819202122232425class PlayerView: UIView { var layoutCallback: ((UIView) -> Void)? override func layoutSubviews() { layoutCallbac ...
Carthage 与 Cocoapods 的不同Cocoapods 是由来已久的 Cocoa 依赖管理工具,那么为什么 Carthage 项目被创建?
首先,Cocoapods(默认情况下)会自动的为你的应用程序和所有依赖创建和更新 Xcode workspace。Carthage 用 xcodebuild 构建框架(framework)的二进制文件,但是并没有将他们整合到用户项目中。Cocoapods 的目的是让用户使用起来更简单,而 Carthage 则是更灵活,减少对项目的侵入性。
Cocoapods 的目标在其README文件中有如下描述:
… to improve discoverability of, and engagement in, third party open-source libraries, by creating a more centralized ecosystem.
对比之下,Carthage 被创建成一个松散(decentralized)的依赖管理者,没有中心项目清单,这减少了维护工作并避免了任何中心故障点(通俗的讲就是去中心化)。然而,项目被 ...
编程语言
未读函数的定义函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”。
1234a = absprint(a(-1))output: 1
pass 定义空函数,目的是为了让程序能够跑起来。
12def my_func(): pass
12345678def my_abs(x): # 检查传入的参数是否正确,只允许 int 和 float 类型的参数 if not isinstance(x, (int, float)): raise TypeError('bad operand type') if x >= 0: return x else: return -x
返回多个值123456import mathdef move(x, y, step, angle=0): nx = x + step * math.cos(angle) ny = y - step * math.sin(angle) return nx, ny
返回值是一个 tuple。返回一个 tuple 可以省略括号,而多个变量可以同时接收 ...
编程语言
未读字符串ord() 函数获取字符的 ASCII 码值
12345print(ord('a'))print(ord('A'))output: 97output: 65
chr() 函数把 ASCII 转换为对应的字符
12345print(chr(66))print(chr(97))output: Boutput: a
由于 Python 的字符串类型是 str,在内存中以 Unicode 表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把 str 变为以字节为单位的 bytes。Python 对 bytes 类型的数据用带b前缀的单引号或双引号表示:
12345print(type(b"a"))print(type("a"))output: <class 'bytes'>output: <class 'str'>
简写的方式是用 ASCII 编码为 bytes 所以不能用于中文,如果是中文需要 UTF-8 编码 ...
我想在之前升级到 macOS Mojave 的同学都会经历过一条命令:
1defaults write -g CGFontRenderingFontSmoothingDisabled -bool NO
执行如上命令会开启苹果之前的字体渲染方式 – 子像素抗锯齿。因为苹果在 Mojave 系统上启用了新的灰度抗锯齿模式,导致 Chrome 浏览器的字体实在无法直视,有幸今天 Chrome 浏览器更新到 72 版本后修复了这个问题。
灰度抗锯齿与子像素抗锯齿科普macOS 10.14 Mojave: The Ars Technica review
Understanding Sub-Pixel (LCD Screen) Anti-Aliased Font Rendering
Antialiasing 101
MDN web docs : font-smooth
subpixel-antialiased - On most non-retina displays, this will give the sharpest text.
grayscale - Render text wi ...
数据结构与算法
未读实现一个名叫 Multiset 的集合数据结构,要具有如下的方法
count(for:) 返回相应数据的存储个数;
add(_:) 添加数据;
删除数据remove(_:)。
举例:
12345678m = Multiset()m.add("cat")m.add("dog")m.add("cat")m.count(for: "cat") -> 2m.remove("cat")m.count(for: "cat") -> 1
实现一我的第一感觉是像一个数组一样的数据结构,所以并没有考虑时间复杂度方面的问题,就直接往下继续了,实现细节如下:
123456789101112131415161718struct Multiset<T: Equatable> { var ary: [T] = [] mutating func add(_ element: T) { ary.append(elemen ...
前阵子忙疯了,最近得空,来更新一下自己的博客 - 记一次 macOS 安装/配置 Jenkins 的过程,方便以后使用。
由于 macOS 新系统 Mojave 字体实在让人看着眼疼,昨天重新装回了 macOS High Sierra,并且机智的用 ThinBackup 备份了自己的项目配置,避免麻烦,配置上面的东西还是挺多的。
安装 JDK去官网下载 JDK 安装就行,太简单,略。
安装 Jenkins建议用 Homebrew 安装,方便配置环境,方便启动与关闭。
1brew install jenkins
安装完成之后会默认启动,直接打开浏览器进入 http://localhost:8080,这时会让你输入初始密码,密码已经在终端显示出来,直接粘过来就行。接下来选择插件,由于我的配置已经在恢复文件中,所以这一步什么都不需要装,直接下一步,创建管理员账号,随便填,保存进入 Jenkins。
恢复配置
安装 ThinBackup 插件。
设置 Backup directory。
将备份文件夹放入第二步设置的路径。
进入 Restore 页面,勾选 Restore nex ...