注解
1.枚举类型传参优化
enum WeekDay{
SUNDAY, MONDAY
}
public static void setDay(WeekDay day){
}
我们已知,枚举类型是一个对象,对象占用的空间较大,有 12 个对象头+对象的数据部分+8 字节对齐,所以这里可以利用注解优化,方案如下:
public class SerenTest {
private int mDay;
public static final int SUNDAY = 1;
public static final int MONDAY = 2;
@IntDef({SUNDAY, MONDAY})
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.SOURCE)
@interface WEEKDAY {
}
public void setDay(@WeekDay int day) {
mDay = day;
}
}
APT:在 javac编译时,执行注解处理器相关的代码。
反射及应用场景
内存中的布局
CPU --------> 高速缓存(栈区) --------> 内存(方法区、堆区)
1. 创建一个局部变量的过程:在栈中创建 v0变量,加载类到方法区,在堆区创建一个对象,由栈区的指针指向堆区的变量。
2. 非静态的局部变量放在_____区。 (堆区)
3. iput-object v0,v1 --------> 把 v0的值赋值给 v1。 iget-object v0,v1 --------> 读取v1,赋值v0
音视频相关
摄像头采集视频流 --------> yuv格式 --------> h.265 h.264编码 -------->
1. 视频信源编码器
- 划分宏块
- 对每个宏块进行方向预测
- 判断宏块前面有没有编码
- 输出运动矢量
2. 视频复合编码器
- 残差数据:除去左边数据和上面的数据,剩下的就是残差数据
- 输出运动适矢量
3. 传输缓冲器
主要拦截 B帧,作为 B帧的缓冲区
编码经验
- 第一帧一定是 I帧,第二帧一定是 P帧
- 硬编硬解码是通过元器件 DSP芯片 硬件来进行的,不是通过 GPU硬编硬解的,GPU主要负责显示特效,显示屏幕,
- yuv数据无法直接显示在surfaceView上,surfaceView只能播放 RGB 数据,所以在显示之前只能通过 GPU 把 YUV 转换成 RGB。
YUV
yuv 420 y:u:v的比例为 4:2:1
yuv 422 y:u:v的比例为 2:1:1
yuv 444 y:u:v的比例为 1:1:1
NV21编码 NV21(安卓设备采集到的)
需要先将 NV21数据转化为NV12,然后再旋转 90 度,之后才可以看到竖屏的画面。
前面是y,后面 u和 v交替排列
YUV I420编码 NV12(网络、iOS、Linux)
I帧、B帧、P帧
- I 帧:100 k以上(I帧越多,文件越大)常见的 I帧间隔是 1s,2s
- B帧:0-35k (B帧越多、文件越小)
- P帧:40-80k
什么时候编码成 I帧、B帧、P帧?
B帧的编码条件:与 I帧的相似程度高达 95% 以上采用 B帧编码。
P:编码程度高达 70% 以上采用 P帧编码。
帧类型分隔符
I 帧的帧类型分隔符是 0x65
P帧的帧类型分隔符是 0x41
B:0x01
MedieCodec
1. 获取 sdcard的读写权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
pps 基础配置帧 68
- 显示格式 yuv444 420 421
- 宽度个高度
sps 全量配置帧 67
sps pps都是重复出现的,丢失了视频无法播放
queueInputBuffer和dequeueInputBuffer区别
H.264 NALU 信息
占用一个字节。
- forbidden_zero_bit(1): 该帧是否可用。0:可用 1:不可用
- nal_unit_type(5):帧类型,I B P
- nuh_temporal_id_plus1(2) :帧的重要性(如I帧 关键帧为 11,P为 10,B为 0)
H.265 NALU 信息
占用两个字节
- forbidden_zero_bit(1): 该帧是否可用。0:可用 1:不可用
- nal_unit_type(6):帧类型,I B P
- nuh_layer_id(6):帧的 id
- nuh_temporal_id_plus1(3) :帧的重要性(如I帧 关键帧为 11,P为 10,B为 0)
H.265和 H.264总结
- avc有 8 种预测方向,hevc有35 种预测方向。
- 在码流传输的时候,通过对齐切片,再传输,划分如下:
切片:
mb_type:
avc预测方向:
hevc预测方向
哥伦布编码
取到正确值的前提下,能正确编码。