VLC

  1. 基本概念:
    I帧、p帧、b帧、DTS、PTS、
    抖动jitter、
    音视频同步:stream clock、system clock、pcr(参考时钟)
    时钟同步:drift

  2. 播放流程:
    input->Demux->audio FIFO->Decoder->DirectSound
    ————–Video FIFO->Decoder->Pic FIFO->DirectShow

access访问:接受获取->内存缓冲
demux解吗:input_decoderdecode->vlc_fifo_QueueUnlocked
es_out.c:创建音视频两个解码器
decode解码:vlc_fifo_DequeueUnlocked->DecoderDecode->
avcodec/video.c->DecodeVideo->vout_putPicture->picture_fifo_push
vlc_fifo_QueueUnlocked->DecoderDecode->avcodec/audio.c->DecodeAudio->aout_decplay
output输出:aout直接播放decoderplayaudio;
vout送入缓存
丢帧策略:以音频为基准,来一帧播放一帧;延时超过500ms,如果缓存有多余的帧,就丢掉一些;视频:比音频快慢20ms就丢(不能丢关键帧..)

  1. 常见问题:
    a. 直播延时:
    启动延时: 进程初始化,如cpu探测、加载组件等;控制协议,如rtsp协议交互时间;关键帧的位置;

    预读取的流太多,等待时间太长,可以通过修改p_sys->ic->probesize、max_analyze_duration来减少
    

    播放延时:网络延时;网络抖动;乱序;丢包;缓存;音视频同步(累积延时);

    音频播放延时的处理函数为aout_decsynchronize
    

    b. 马赛克:由于gop中的p帧丢失,导致部分连续新鲜丢失;h264解码的时候会根据前面的参考帧来补齐,从而造成马赛克现象。
    c. 卡顿:如果I帧丢失,就没法显示一个GOP内的所有帧,而I帧周期较长,所以会导致下一个I帧到来之前画面静止不动。
    丢帧策略-> threaddisplaypreparepicture里,即使“too late to be displayed”,也是隔一帧才丢一帧,不连续丢。
    d. 裁减:减少flash占用、加快vlc初始化、减少内存占用

  2. 历史故障:
    a. 某地长城宽带用户无法播放xx摄像头的直播流,问题原因:
    b. 用户app在局域网内无法播放直播流,更换家庭网关则正常

  1. VLC启动流程
    libvlc_InternalInit(): log初始化、注册组件、
    avcodec_skip_frame:跳侦的作用?
    avcodec_skip_idct:

UITableView的常见问题

  1. 如果是系统自动计算cell的高度,则cell内的自动布局要针对contentView,而不是cell本身
1
2
3
4
5
6
let list = UIView()
cell.contentView.addSubView(list)
list.snp.makeConstraints { (make) in
make.edges.equalTo(cell!.contentView) //正解!
//make.edges.equalTo(cell!) //错误
}
  1. 如何去掉section的上下两条分割线?tablestyle设置成plain,有两个以上section就木有这两条分割线了

pod demo

Uncomment this line to define a global platform for your project

platform :ios, ‘8.0’
use_frameworks!
workspace ‘XXXX’

def share_pods
pod ‘SnapKit’, ‘~> 4.0.0’
pod ‘MJExtension’, ‘~> 3.0.13’
pod ‘HandyJSON’, ‘~>4.0.0-beta.1’
end

frame、bounds

frame: 该view在父view坐标系统中的位置和大小。(参照点是,父亲的坐标系统)
bounds:该view在本地坐标系统中的位置和大小。(参照点是,本地坐标系统,就相当于ViewB自己的坐标系统,以0,0点为起点)
center:该view的中心点在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)

  1. 获取相对于屏幕的frame坐标:
    selectCell.convert(selectCell.card.frame, to: nil)

  2. 使用autolayout自动布局后,view的frame就没法直接手动修改了。我们可以认为使用了autolayout的view的frame属性是一个只读的属性。在代码里认为的改动这个view的frame并不能对这个view的frame产生真正的效果。 如在制作动画的时候,去修改子view的frame,不会有任何效果。

微交互

原文地址:http://www.lukew.com/ff/entry.asp?1726

  1. 微交互具有单一性,一次只专注的做一件事。一个功能,可以有多种微交互。
  2. 设计师对产品也是有感情的,如果设计师喜欢他设计的产品,肯定会想方设法加入各种细节和微交互,反之,则不会加入,草草了事。

函数式编程

函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)

函数式程序就是一个表达式,这里的函数是指数学函数,与一般语言的函数有区别
函数式编程关心数据的映射,命令式编程关心解决问题的步骤。

函数式编程的特点。

函数是”第一等公民”

所谓”第一等公民”(first class),指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。可以和变量一样,在任何地方定义和使用。
举例来说,下面代码中的print变量就是一个函数,可以作为另一个函数的参数。
var print = function(i){ console.log(i);};
  [1,2,3].forEach(print);

只用”表达式”,不用”语句”

“表达式”(expression)是一个单纯的运算过程,总是有返回值;”语句”(statement)是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。
原因是函数式编程的开发动机,一开始就是为了处理运算(computation),不考虑系统的读写(I/O)。”语句”属于对系统的读写操作,所以就被排斥在外。
当然,实际应用中,不做I/O是不可能的。因此,编程过程中,函数式编程只要求把I/O限制到最小,不要有不必要的读写行为,保持计算过程的单纯性。

没有”副作用

所谓”副作用”(side effect),指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。
函数式编程强调没有”副作用”,意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。

不修改状态

上一点已经提到,函数式编程只是返回新的值,不修改系统变量。因此,不修改变量,也是它的一个重要特点。
在其他类型的语言中,变量往往用来保存”状态”(state)。不修改变量,意味着状态不能保存在变量中。函数式编程使用参数保存状态,最好的例子就是递归。下面的代码是一个将字符串逆序排列的函数,它演示了不同的参数如何决定了运算所处的”状态”。

引用透明性

函数程序通常还加强引用透明性,即如果提供同样的输入,那么函数总是返回同样的结果。就是说,表达式的值不依赖于可以改变值的全局状态。这使您可以从形式上推断程序行为,因为表达式的意义只取决于其子表达式而不是计算顺序或者其他表达式的副作用。这有助于验证正确性、简化算法,甚至有助于找出优化它的方法。

副作用

副作用是修改系统状态的语言结构。因为 FP 语言不包含任何赋值语句,变量值一旦被指派就永远不会改变。而且,调用函数只会计算出结果 ── 不会出现其他效果。

柯里化

只传递给函数一部分参数来调用函数,然后返回一个函数去处理剩下的参数。本质上,柯里化就是对高阶函数(就是一种对过程的抽象 参考map它就是一个抽象的过程)的降阶处理。比如 function(arg1,arg2)变成function(arg1)(arg2)。function(arg1,arg2,arg3)变成function(arg1)(arg2)(arg3)….以此类推。

声明式思维

编程范式

两种编程范式:

  • 命令式编程范式:命令“机器”如何去做事情(how),这样不管你想要的是什么(what),它都会按照你的命令实现。

    • 面向对象编程,如c++、Java
    • 面向过程编程,如c语言
    • 响应式编程:rxswift
    • 链接式编程:典型示例 snapkit
    • 面向切片编程:AOP
  • 声明式编程范式:告诉“机器”你想要的是什么(what),让机器想出如何去做(how)。
    声明式编程范式常见有以下两种:

    • 领域特定语言(Domain Specific Language,DSL):
      名字很陌生,但是我们却经常在用。如SQL、CSS以及正则表达式等等。这些语言只在特定领域起作用,并且使用这些语言时,我们大多数时候是在写“陈述、声明”的语句。如“select * from tb”,我们只关心我们要的结果,而不用去关系具体实现。
    • 函数式编程(Functional Program,FP):函数式编程是我们要讨论的重点。既然它属于声明式编程范式,那么它也应该强调结果(What)而非过程(How)。没错,函数式编程不同于常见的命令式编程,它不关心计算机具体的实现过程,而仅仅注重问题结果。

iOS新特性

iOS 新特性

来源: https://github.com/iamjiyixuan/iOS-dev-skill-map

iPhone X
Safe Area
Face ID
苹果官方 iPhone X 适配指南

iOS 11
Core ML
ARKit
WWDC 2017
开发者所需要知道的 iOS 11 SDK 新特性 by onevcat 2017.06

iOS 10
Extension
SiriKit
扩展阅读
WWDC 2016
开发者所需要知道的 iOS 10 SDK 新特性 by onevcat 2016.06
iOS 9
Multitasking
UI Test
扩展阅读
WWDC 2015
开发者所需要知道的 iOS 9 SDK 新特性 by onevcat 2015.06
iOS 8
iOS 8 VoIP Notifications by Pierre-Marc Airoldi 2015.03
扩展阅读
WWDC 2014
开发者所需要知道的 iOS 8 SDK 新特性 by onevcat 2014.07
iOS 7
Multitasking
WWDC 2013 Session 204 - What’s New with Multitasking
后台获取 (Background Fetch)
推送唤醒 / 静默推送 (Silent Remote Notifications)
后台传输 (Background Transfer Service)
扩展阅读
WWDC 2013
开发者所需要知道的 iOS 7 SDK 新特性 by onevcat 2013.06

,