音视频

图形基础

像素位深

  • RGB888(24位) 一个色一个字节(8bit)
  • RGBA(32位) 一个色一个字节(8bit) A: 透明度,一个字节(8bit)

RGB色彩问题

  • BMP图像使用的是BGR格式,需要将BGR转换位RGB格式

屏幕指标

  • PPI : 单位英寸内的像素个数,越大表明单位英寸内像素越多,屏幕越好
  • DPI : 单位英寸内的点数,可能一个点包含多个像素,一般PPI == DPI
  • PPI > 300 就属于视网膜级别

码流的计算

分辨率

  • X轴的像素个数*Y轴的像素个数
  • 常见的宽高比16:9/ 4:3
  • 360P/720P/1K/2K
    • 360p是640x360,720p是1280x720,1k是1920x1080即1080p,2k是2560x1440即1440p

帧率

  • 每秒钟采集/播放图像的个数(每秒播放的帧数)
  • 动画的帧率是25帧/s
  • 常见的帧率:15帧/s ,30帧/s,60帧/s

未编码视频的RGB码流

  • RGB码流=分辨率(宽x高) x 3(Byte) x 帧率(25帧)
    • 例如∶1280x720x3x25 = 69120000 约69 M

YUV

  • YUV(也称YCbCr ) :Y表示明亮度,UV的作用是描述影像色彩及饱和度
  • 主要的采样格式有YUV4:2:0(标准,都支持)、YUV4:2:2和YUV4:4:4

image-20230725113104641

image-20230725113133855

image-20230725113155373

YUV4:2:0

  • 4:2:0并不意味着只有Y、Cb(蓝色)两个分量,而没有Cr(红色)分量。
  • 它实际指得是对每行扫描线来说,只有一种色度分量,它以2:1的抽样率存储。
  • 相邻的扫描行存储不同的色度分量,也就是说,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0…以此类推。
  • 数据量计算(YUV4:2:0)
    • YUV = Y * 1.5
      YUV = RGB /2

YUV4:2:0存储格式

  • planar (平面)
    • 1420 : YYYYYYYY UU VV =>YUV420P
    • YV12: YYYYYYYY VV UU => YUV420P
  • packed(打包)
    • NV12 : YYYYYYYY UVUV =>YUV420SP
    • NV21: YYYYYYYY VUVU =>YUV420SP

image-20230725113807188

未编码视频的YUV码流

  • RGB码流=分辩率(宽x高)x 3 x帧率
  • YUV码流=分辩率(宽x高)x1.5X帧率

RGB与YUV的关系

  • RGB用于屏幕图像的展示

  • 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

生成YUV

  • -i : 输入文件
  • -an : a表示音频 n表示no 表示不处理视频中的音频
  • -c:v : 视频的解码器编码器
  • -pix_fmt : 指定输出的yuv格式为yuv420p
1
2
3
4
ffmpeg -i input.mp4
-an
-C:V rawvideo
-pix_fmt yuv420p out.yuv

播放YUV

  • -s : 指定分辨率
1
ffplay -pix_fmt yuv420p -S 608x368 out.yuv

播放Y分量

  • -vf : 指定使用简单滤波器
1
2
3
ffplay -pix_fmt yuv420p
-S 608x368
-vf extractplanes= 'y' out.yuv

提取各分量

-filter_complex : 指定使用复杂滤波器

1
2
3
4
5
6
ffmpeg -i ~/Documents/new_killer.mp4
-filter_complex
'extractplanes=y+u+vly][u][v]'
-map 'ly]' y.yuv
-map '[u]' u.yuv
-map '[v]' v.yuv

9-8 —- 9-10 待学习

H264编码

压缩比1/100

码流建议:https://docportal.shengwang.cn/cn

https://docportal.shengwang.cn/cn/video-call-4.x/video_profile_apple_ng?platform=iOS

码率

  • 条件
    • 1.YUV格式为YUV420
    • 2.分辨率为640x480
    • 3.帧率为15
1
640 * 480 * 1.5 * 15 = 55M  单位是字节
  • 建议码流:500kpbs

GOP

  • group of picture
  • 一组差别不大的图片

I/P/B帧

  • Ⅰ帧(intraframe frame),关键帧,采用帧内压缩技术。IDR帧属于Ⅰ帧
    • 就是GOP的第一帧
  • P帧(forward Predicted frame),向前参考帧。压缩时,只参考前面已经处理的帧,采用帧间压缩技术。它I帧的一半大小
    • 参考前面的I帧
  • B帧(Bidirectionally predicted frame),双向参考帧。压缩时,既参考前面已经处理的帧,也参考后面的帧,帧间压缩技术。它占Ⅰ帧1/4大小
    • 参考前面的I帧和后面的P帧
    • 参考前面的p帧和后面的P帧
    • 参考前面的P帧和后面的I帧

image-20230725160811958

IDR帧与I帧的区别与联系

  • IDR(Instantaneous Decoder Refresh)解码器立即刷新
  • 每当遇到IDR帧时,解码器就会清空解码器参考buffer中的内容
  • 每个GOP中的第一帧就是IDR帧
  • IDR帧是一种特殊的Ⅰ帧

SPS与PPS

  • SPS (Sequence Parameter Set): 图片之间的编码信息
    • 序列参数集,作用于一串连续的视频图像。如
      • seq_ parameter_ set id、
      • 帧数及POC(picture order count)的约束、
      • 参考帧数目、
      • 解码图像尺寸
      • 帧场编码模式选择标识等
  • PPS (Picture Parameter Set): 图片内的编码信息
    • 图像参数集,作用于视频序列中的图像。如
      • pic_ parameter. set_ id、
      • 熵编码模式选择标识、
      • 片组数目、
      • 初始获量化参数
      • 去方块滤波系数调整标识等

H264压缩技术

  • 有损压缩
    • 帧内压缩,解决的是空域数据冗余问题
    • 帧间压缩,解决的是时域数据冗徐问题
  • 无损压缩
    • 整数离散余弦变换( DCT ) , 将空间上的相关性变为频域上无关的数据然后进行量化
    • CABAC压缩

码流基本概念

  • SODB ( String Of Data Bits )
    原始数据比特流,长度不一定是8的倍数 ,故需要补齐。
    它是由VCL层产生的。
  • RBSP ( Raw Byte Sequence Payload )
    SODB + trailing bits
    算法是如果SODB最后-个字节不对齐,则补1和多个0.
  • NALU
    NAL Header(1B) + RBSP

image-20230725165601178

SPS

Profile & Level
  • H264 Profile
    • 对视频压缩特性的描述,Profile越高,就说明采用了越高级的压缩特性
  • H264 Level
    • Level是对视频的描述, Level越高,视频的码率、分辨率、fps越高

image-20230804173707337

PPS

image-20230804174251294

Slice-Header

  • 帧类型
  • GOP中解码帧序号
  • 预测权重
  • 滤波

分析工具

https://www.elecard.com/products/video-analysis

https://jaist.dl.sourceforge/project/h254streamanalysis/binary/SpecialVH264.exe

https://sourceforge.net/projects/videoeye/files/

L069

常用命令

ffmpeg音视频处理流程

  • demuxer是解封装,封装格式:mp4, flv
  • decoder 是解码,编码格式:h264,h265,aac
  • encoder 是编码
  • muxer 是封装

image-20230814112340461

基本信息查询

image-20230814112659039

录制命令

  • 录制屏幕
    • ffmpeg -f avfoundation -i 1-r 30 out.yuv
      • -f :指定使用avfoundation采集数据
      • -i∶指定从哪儿采集数据,它是一个文件索引号, 1表示屏幕的索引
      • -r∶指定帧率, 30表示每秒30帧
      • 保存为yuv格式
    • 播放录制的视频:ffplay -s 2560x1600 -fix_fmt uyvy422 out.yuv
      • -s:设定播放的分辨率
      • -fix_fmt:设置像素格式
    • mac 查看avfoundation的设备索引
      • ffmpeg -f avfoundation -list_devices true -i ""
  • 录制音频
    • ffmpeg -f avfoundation -i :1 out.wav
      • -i:指定采集数据的设备索引 :1表示从话筒(音频)采集,:前表示采集视频的索引,:后表示采集音频的索引

分解与复用

换封装格式

提取视频、音频

不涉及编解码,只有解封装和封装

多媒体格式转换

  • ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv
  • ffmpeg -i out.mp4 -an -vcodec copy out.h264
    • 抽取视频
  • ffmpeg -i out.mp4 -acodec copy -vn out.aac
    • 抽取音频

处理原始数据

FFmpeg提取YUV数据
ffmpeg -i input.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv

  • -c:v rawvideo : 指定视频编码格式
  • -pix_fmt yuv420p : 指定视频像素格式

FFmpeg提取PCM数据
ffmpeg -i out.mp4 -vn -ar 44100 -ac2 -f s16le out.pcm