分辨率 采样频率 采集格式 传输通道
采集源 摄像头 屏幕录制 文件推流
android: setPreviewCallback MediaRecorder
iOS: AVFoundation
pc: mjpeg-streamer
滤镜: GPUImage 音频: SoundTouch
视频是由一组图像组成的 图像是由像素组成 像素是由RGB组成: 位深 RGB888(24位), RGBA(32位) 分辨率 横轴 x 纵轴
RGB 发光二极管, 用于屏幕图像的展示
RGB与BGR, 有些数据是BGR, 显示前需要把BGR转换成RGB, BMP是使用BGR
YUV(YCbCr): Y表示明亮度, UV的作用是描述影像色彩及饱和度, 主要的采样格式有YUV4:2:0, YUV4:2:2和YUV4:4:4 YUV用于采集与编码
RGB转YUV:
Y = 0.299*R + 0.587*G' + 0.114*B
U = -0.147*R - 0.289*G + 0.436*B = 0.492*(B-Y)
V = 0.615*R - 0.515*G - 0.100*B = 0.877*(R-Y)
YUV转RGB:
R = Y + 1.140*V
G = Y - 0.394*U - 0.581*V
B = Y + 2.032*U
YUV4:4:4 - 1280 x 720 x 3 (每个像素都有一个yuv保存) YUV4:2:2 - 1280 / 2 * 720 * 3 + 1280 / 2 * 720 (一列是yuv, 一列只有y, 交替) YUV4:2:0 最标准: Cb分量, Cr分量隔行扫描, 1280 / 2 * 720 * 2 + 1280 / 2 * 720 (一列是YU, 一列是Y, 交替; 一行是YU, 一行是YV, 交替)
YUV4:4:4 = 分辨率 * 3 YUV4:2:2 = 分辨率 * 2 YUV4:2:0 = 分辨率 * 1.5 YUV4:2:0 = RGB / 2
常见的宽高比 16:9 / 4:3
条件:
一秒钟数据大小 = 640 * 480 * 1.5(YUV420) * 15 * 8(前面是byte, *8转bit) = 55mbps h264建议码流 = 500kpbs 压缩比: 500 / 55000 = 1/ 100
Mbps是megabits per second的缩写,是一种传输速率单位,指每秒传输的位(比特)数量。1Mbps代表每秒传输1,000,000位(bit),即每秒传输的数据量为:1,000,000/8=125,000Byte/s
把相似的帧分组成
分组帧
, 存储一组相似数据和差异数据 如果GOP分组中有帧丢失, 会造成解码端的图像发生错误, 这会出现马赛克(花屏) 花屏后, 会把花屏的GOP分组丢掉, 但是切换下一个IDR帧需要一个周期, 所以会出现卡顿
SPS和PPS参数会在I帧中同时出现
块结构的混合编码, 把图片分块, 块中相似性大的使用
渐变处理方法
, 相似性不大保存原数据. 采用渐变处理方法是有损压缩, 但是细微差别不明显. 电影源用的是无损压缩jpeg2000
帧内预测: 有9种模式, 亮度块和色度块单独预测 殘差值计算
压缩: 预测值 + 残差值, 就可以还原(有损)
运动矢量, 使用(宏块查找算法)在两副图中的位置, 来确定运动矢量 运动估计, 多个运动矢量组成 残差值
H264 Profile, 对视频压缩特性的描述 H264 Level, 对视频的码率, 分辨率, fps相关
// 分辨率相关
pic_width_in_mbs_minus1
pic_heigh_in_mbs_minus1
frame_mbs_only_flag
frame_cropping_flag
frame_crop_left_offset
frame_crop_right_offset
frame_crop_top_offset
frame_crop_bottom_offset
// 帧相关
log2_max_frame_num_minus4 // 帧数
max_num_ref_frames // 参考帧数
pic_order_cnt_type // 显示帧序号
// 帧率的计算
framerate = (float)(sps->vui.vui_time_scale) / (float)(sps->vui.vui_num_units_in_tick) / 2;
entropy_coding_mode_flag
num_slice_groups_minus1
weighted_pred_flag
weighted_bipred_idc
pic_init_qp_minus26
pic_init_qs_minus26
chroma_qp_index_offset
deblocking_filter_control_present_flag
constrained_intra_pred_flag
redundant_pic_cnt_present_flag
屏幕指标:
RGB码流= 分辨率(宽x高) * 3(byte 三原色) * 帧率
// 打开编码器
avcodec_find_decoder_by_name
avcodec_alloc_context3
// SPS/PPS
enc_ctx->profile = FF_PROFILE_H264_HIGH_444;
enc_ctx->level = 50; // 表示LEVEL是5.0
// 设置分辨率
enc_ctx->width = width;
enc_ctx->height = height;
// GOP
enc_ctx->gop_size = 250;
enc_ctx->keyintmin = 25; // option
// 设置B帧数据
enc_ctx->max_b_frames = 3; // option
enc_ctx->has_b_frames = 1; // option
// 设置参考帧数量
enc_ctx->refs = 3; // option, 越大处理慢还原性好
// 设置输入YUV格式
enc_ctx->pix_fmt = AV_PIX_FMT_YUV420P;
// 设置码率
enc_ctx->bit_rate = 60000; // 600kbps
// 设置帧率
enc_ctx->time_base = (AVRational){1, 25}; // 帧与帧的间隔
enc_ctx->framerate = (AVRational){25, 1}; // 帧率, 每秒25帧
avcodec_open2
avcodec_send_frame
avcodec_receive_frame // 解码
avcodec_receive_packet // 编码
音视频学习:YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P、YUV444P的区别
Recommended 8-Bit YUV Formats for Video Rendering
VLC YUV
fourcc
Advanced Video Coding
MPEG