Android 知识沉淀

发布于:2025-04-13 ⋅ 阅读:(28) ⋅ 点赞:(0)

注解

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. 视频信源编码器

  1.  划分宏块
  2. 对每个宏块进行方向预测
  3. 判断宏块前面有没有编码
  4. 输出运动矢量

2. 视频复合编码器

  1. 残差数据:除去左边数据和上面的数据,剩下的就是残差数据
  2. 输出运动适矢量

3. 传输缓冲器

主要拦截 B帧,作为 B帧的缓冲区

编码经验

  1. 第一帧一定是 I帧,第二帧一定是 P帧
  2. 硬编硬解码是通过元器件 DSP芯片 硬件来进行的,不是通过 GPU硬编硬解的,GPU主要负责显示特效,显示屏幕,
  3. 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总结

  1. avc有 8 种预测方向,hevc有35 种预测方向。
  2. 在码流传输的时候,通过对齐切片,再传输,划分如下:

切片:

mb_type:

avc预测方向:

hevc预测方向

哥伦布编码

取到正确值的前提下,能正确编码。


网站公告

今日签到

点亮在社区的每一天
去签到