0%

模块结构

  • libavformat:实现在流协议,容器格式及其本地IO访问。多媒体格式解析、解封装、封装。
  • libavutil:简化编程的工具函数库。包括随机数生成器,数据结构,数学函数,多媒体核心工具函数等等。
  • libavcodec:各种编解码器的封装。自身不做编解码,编解码器是通过插件插入的。
  • libavdevice:输入/输出设备接口封装。
  • libavfilter:音视频的后期处理。
  • libswresample:实现混音和重采样。
  • libswscale:用于执行高性能的图像缩放,颜色空间或像素格式转换的库。

基本步骤:

  1. 打开编码器,设置编码器参数;
  2. 转换图像格式,NV12->YUV420P;
  3. 准备编码数据AVFrame;
  4. 进行编码;

命令生成YUV:

1
2
3
4
5
6
7
8
9
10
11
ffmpeg -i input.mp4 \
-an \
-c:v rawvideo \
-pix_fmt yuv420p out.yuv

# 提取各分量
ffmpeg -i input.mp4 \
-filter_complex 'extractplanes=y+u+v[y][u][v]' \
-map '[y]' y.yuv \
-map '[u]' u.yuv \
-map '[v]' v.yuv

这里讨论的是使用源码方式编译按照,而不是使用brew安装(后期不可裁剪)。

编译依赖准备

1. 秒开优化

改写播放器逻辑让播放器拿到第一个关键帧后就给予显示。GOP的第一帧通常都是关键帧,由于加载的数据较少,可以达到“首帧秒开”。如果直播服务器支持GOP缓存,意味着播放器在和服务器建立连接后可立即拿到数据,从而省却跨地域和跨运营商的回源传输时间。

在看资料的时候,经常看到压缩率和压缩比这两个术语,仔细一看,发现两者竟然是完全相反的概念,虽然常常看到资料中并没有明确区分。

数据压缩比,data compression ratio。例如:预测帧比关键帧具有更高的压缩比。 \[ {\rm {Compression\;Ratio}}={\frac {\rm {Uncompressed\;Size}}{\rm {Compressed\;Size}}} \] 注意,维基百科中只提到了数据压缩比。

CDN(Content Delivery Network),内容分发网络。最初的目的是解决静态页面的加速问题。通过就近接入的方式解决访问网络资源的问题。

CVPixelBuffer 类似 Android 的 bitmap,核心是封装了已经解压后的图像数据。保存了像素的 format,图像宽高和 buffer 指针等信息。

CVPixelBuffer 创建与转换