音视频
https://www.jianshu.com/p/ca4d8e3bbd69
播放https://zhuanlan.zhihu.com/p/54167734
基础
https://juejin.im/post/6844903555141238791#heading-21
视频
1、码率 视频文件在单位时间内使用的数据流量,也叫码率或码流率,通俗一点的理解就是取样率,是视频编码中画面质量控制中最重要的部分,一般我们用的单位是kb/s或者Mb/s 关系着带宽、文件体积
2、帧率 FPS(Frames Per Second)- - - 帧/秒 关系着画面流畅度和cpu消耗
3、分辨率 指视频成像产品所成图像的大小或尺寸 关系着图像尺寸和清晰度
音频
1、声道数:声道数是音频传输的重要指标,现在主要有单声道和双声道之分。双声道又称为立体声,在硬件中要占两条线路,音质、音色好, 但立体声数字化后所占空间比单声道多一倍。
2、量化位数: 量化位是对模拟音频信号的幅度轴进行数字化,它决定了模拟信号数字化以后的动态范围。由于计算机按字节运算,一般的量化位数为 8位和16位。量化位越高,信号的动态范围越大,数字化后的音频信号就越可能接近原始信号,但所需要的存储空间也越大。
3、采样率:也称为采样速度或者采样频率,定义了每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。cd采样率44100hz dvd 采样率 48000hz
比特率(音频) = 采样率 x 采样位数 x 声道数
同步
1. 无法察觉:音频和视频的时间戳差值在:-100ms ~ +25ms 之间
2. 能够察觉:音频滞后了 100ms 以上,或者超前了 25ms 以上
3. 无法接受:音频滞后了 185ms 以上,或者超前了 90ms 以上
ijkplayer中的同步
https://juejin.im/post/6844903613005824014
https://www.jianshu.com/p/d31f01299847
普通的同步原理
https://blog.csdn.net/myvest/article/details/97416415
mp4
https://www.jianshu.com/p/529c3729f357
stss 关键帧stts 时间戳表
h.264
https://zhuanlan.zhihu.com/p/93398878
https://zhuanlan.zhihu.com/p/71928833
H264可以分为2层:视频编码层『VCL』和网络提取层『NAL』
VCL 最后会被包装成NAL
宏块 16×16
帧内预测 各个方向的预测 8种预测方式(8个方向)
帧间预测 运动搜索 找同样的宏块运动路径 运动补偿
在 NALU 头里面,主要的内容是类型 NAL Type。0x07 表示 SPS,是序列参数集, 包括一个图像序列的所有信息,如图像尺寸、视频格式等。0x08 表示 PPS,是图像参数集,包括一个图像的所有分片的所有相关信息,包括图像类型、序列号等
逐行扫描 帧编码 适用于动态图像
隔行扫描 场编码 适用于非动态图像 I帧 = 奇数场 + 偶数场
YUV (YCbCr)
Y 亮度分量 U 蓝色分量 V 红色分量
H.265(hevc)
https://blog.csdn.net/weixin_42229404/article/details/84639538
目前的HEVC标准共有三种模式:Main、Main10和Main Still Picture。Main模式支持8bit色深(即红绿蓝三色各有256个色度,共1670万色),Main10模式支持10bit色深,将会用于超高清电视(UHDTV)上
1.帧内预测 33个方向
2.编码代码 树编码(四叉树) 宏块 8×8 16×16 32 ×32 64×64
3.可变量的尺寸转换(从4×4 到32×32)
10bit
10bit视频是指一种视频编码的特征,意思是每个颜色通道用10个bit来表达。这样,每个颜色通道的色彩级数从8bit的256级提高到了1024级
1.防止banding(色彩平滑过渡区域的色带,8bit编码技术可以通过一种称为dither(抖动)的方法,也就是在色块边缘混入细碎的相邻色的色点,来模糊色块边缘)产生2 提升暗场效果3.更好地容纳噪点
缺点 硬件的支持
MediaCodec
切换码率会花屏,因为要重新初始化一个新的MediaCodec实例,这时候会触发GPU重新生成一个dev node,在这个过程中不会平滑执行的,存在花屏的情况
ffmpeg
pts dts time_base nb_sample sample_rate https://www.cnblogs.com/ZY-Dream/p/10245464.html
av_read_frame会阻塞 通过 avformatcontext->interrupt_calllback 来防止阻塞
seek 针对无关键帧位置信息,通过码率猜一个位置,然后读到一个payload头,判断是继续向前还是向后查找
分析文件 (probesize analyzeduration 那个标准先达到,那就听谁的,停止probe)
probesize默认为5000000(5M) 最小是32字节 可设置为2048
analyzeduration 默认5s flv 90s mpeg 7s
直播
https://zhuanlan.zhihu.com/p/53038472
首开时间
1.申请资源的播放 URL 地址的时机优化
争取在用户点击播放之前拿到 URL
2. DNS 解析优化
提前完成 DNS 解析,并缓存结果
增加DNS缓存模块
注意事项:1.app启动时,缓存一部分提前配置的dns
2.缓存的ip刷新问题 DNS 解析有一个 TTL 超时时间,到期前要记得重新解析刷新
监测手机网络切换事件,比如:WiFi 切换到 4G 后,需要清空缓存
CDN 服务商会从 HTTP/RTMP 协议中的Host字段/tcUrl参数中 “提取” 的域名,所以需要改造播放器底层的 HTTP/RTMP 代码模块,提供设置字段的接口
3. 服务器的连接和数据传输速度优化
主要是服务器节点与播放器之间的网络传输优化
**4. 视频流的媒体信息解析优化 **
主要是解析提取算法的优化
mp4的moov可能会处于头或者尾的位置。对于 moov 媒体信息在尾部的 mp4 文件,播放器读取一定数据后,如果判断 moov 在尾部,则可以暂停这个线程,同时启动第二线程通过 http range 字段读取尾部的 moov
针对ffmpeg的播放器
1.减小 probesize
2.减小 analyzeduration
3.预设码流的音视频格式
5. 解码和渲染策略优化
GOP 缓存,确保首帧为关键帧解码渲染
服务器缓存一个Gop帧数据,首先下发
延时优化
https://zhuanlan.zhihu.com/p/54167734
1. 网络线路优化
- 选择优质的 CDN 加速服务,保障传输的网络带宽和线路资源
- 测速选线,动态监测,智能调度,确保每一路流的传输质量
2. 降缓冲区
- 生产端减小 GOP 大小,从而减少服务端 GOP 缓存的大小
- 生产端根据发送缓冲区情况,动态调整帧率、码率
- 播放端主动丢帧/追帧/倍数播放,加快缓冲区的消耗
3. 协议/传输优化
- Based on TCP -> Based on UDP,如:QUIC,RTP/RTCP
- 传输策略优化:前向纠错,丢包重传策略,拥塞控制优化,关键帧请求等
4. 处理性能优化
- 硬件编解码/美颜/渲染等处理
- 算法性能调优
OpenGL ES
纹理坐标系是二维坐标系,原点在左下角,s(x)轴向右,t(y)轴向上,x y 取值范围都是 [0, 1] strq
但由于计算机中图片都是 y 轴向下,所以实际上依然是原点在左上角,s(x)轴向右,t(y)轴向下
vector 坐标 是居中的十字坐标 x,y,z的取值范围都是 [-1,1] xyzw
- attribute 属性变量。只能用于顶点着色器中。 一般用该变量来表示一些顶点数据,如:顶点坐标、纹理坐标、颜色等
- uniforms 一致变量。在着色器执行期间一致变量的值是不变的。与const常量不同的是,这个值在编译时期是未知的是由着色器外部初始化的。
- varying 易变变量。是从顶点着色器传递到片元着色器的数据变量。