> For the complete documentation index, see [llms.txt](https://cifar.gitbook.io/note/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cifar.gitbook.io/note/kai-fa/kai-fa-xiang-guan-gong-ju/ffmpeg-zhi-shi.md).

# ffmpeg知识

## 自学部分

FFMPEG免安装版：<https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz>

历史各个版本的免安装版：<https://www.johnvansickle.com/ffmpeg/old-releases/>

## 编解码知识

### [雷宵华博客](https://blog.csdn.net/leixiaohua1020)（雷神）

### 学习流程

[ffmpeg的基础概念](https://blog.csdn.net/leixiaohua1020/article/details/15811977)  （博客标准比较老 ，如果你想自己学。官网的例子是ffmpeg4的示例，需要编库）

> 源码从github拉一份编译就行
>
> ./configure --enable-shared --disable-static --enable-gpl --enable-libxavs --prefix=123
>
> ./configure --enable-shared --disable-static --enable-gpl --prefix=123
>
> 1、编译时提示 “deabi/bin\ld: error: cannot open libavutil/libavutil.so: Invalid argument”&#x20;
>
> “make: \*\*\* \[ffbuild/library.mak:103：libavfilter/libavfilter.so.7]”&#x20;
>
> 分析原因：链接器无法识别 cygwin 的软链接符号&#x20;
>
> 解决方案：.configure编译参数添加--ln\_s="cp -rf"选项

编码原理：[雷神博客](https://blog.csdn.net/leixiaohua1020/article/details/28114081)、[油视频](https://www.youtube.com/watch?v=Kv1Hiv3ox8I)、[B站翻译](https://www.bilibili.com/video/BV1Nr4y1S76N?p=1\&t=485)

[官方的 解码示例](https://ffmpeg.org/doxygen/trunk/examples.html) [学习示例](http://dranger.com/ffmpeg/)  [示例解读](https://www.cnblogs.com/yisonli/p/3318181.html)

[结构体分析](https://www.freesion.com/article/318636473/)

### RTMP

[rtmp 推流器](https://blog.csdn.net/leixiaohua1020/article/details/39803457)

> [time\_base](https://www.cnblogs.com/yongdaimi/p/10684953.html) &#x20;
>
> [时间戳相关函数](https://blog.csdn.net/topsluo/article/details/76239136)
>
> pts ：显示时间戳
>
> dts ：解码时间戳

### 音频解码

> [ffmpeg提取音频存为PCM](https://my.oschina.net/vintnee/blog/640567)
>
> [FFmpeg音频解码（note 5）](https://zhuanlan.zhihu.com/p/356924774)

### [音频平面数据与非平面数据，AVFrame](https://www.cnblogs.com/my_life/articles/6841859.html)

## [音视频基础+ffmpeg原理+项目实战 一课完成音视频技术开发入门](https://coding.imooc.com/learn/list/415.html)

### 第2章 音视频环境基础

#### 视频2-2 推流中断与画质不清晰解决办法

1、问题：推流中断

原因：ffmpeg 内部默认以最快方式。音视频分开，异步推送，导致时间戳不一致。导致中断

```
Failed to update header with correct duration.
Failed to update header with correct filesize.
```

解决方案：添加 -re

> $ ffmpeg -re -i new\_killer.mp4 -f flv rtmp\://localhost/live/test

2、问题：画质不清晰

原因：-f flv  将MP4视频重新编码，重编码，视频质量有损失。（默认视频质量编码）

解决方案：添加 -c copy   不重新编码，按原来音频视频方式

> $ ffmpeg -re -i ·/Documents/new\_killer.mp4 -c:v copy -f flv rtmp\://localhost/live/test
>
> -c:v  视频拷贝，音频暂时不管

#### ffmpeg 丢包 会造成：视频花屏或卡顿

### 第3章 编译 ffmpeg

#### Mac/Linux编译ffmpeg

* 下载ffmpeg：<http://ffmpeg.org/download.html> &#x20;
* 编译ffmpeg： ./configure --prefix=/usr/local/ffmpeg --enable-debug=3  (默认编译静态库)
* make -j 4
* make install

&#x20;./configure --prefix=/usr/local/ffmpeg --enable-debug=3 --disable-static --enable-shared (设置编译动态库)

&#x20; ./configure --help | grep static  (查找与static相关的配置)

### 第五章 音频基本知识

#### 音频处理流程 <img src="/files/Cw14bXNPeXroI62udkZu" alt="" data-size="line">    <img src="/files/7vFDo7oWdbx3p0brG0Wx" alt="" data-size="line">

#### 声音是如何被听到的 <img src="/files/y502cip1FSg2WXHLEfM9" alt="" data-size="line">  <img src="/files/xuvu4ddhHLtWvbQnHFrL" alt="" data-size="line">  <img src="/files/BigY2yq5dNsKLPSu9r8R" alt="" data-size="line">  <img src="/files/OkdQTxFFhztK7UrE0C8s" alt="" data-size="line">

> 耳廓：像很小的声音聚拢到一起，传入耳道
>
> 耳道：使声音有增大的效果，耳道越长对声音越敏感。（对纸卷成筒，对筒说话，传递的更远更清晰，力量散出去之后，声音变的很微弱。）
>
> 鼓膜震动等其他，最后传递到听觉神经系统。由听觉系统与大脑连接最后判断是什么声音。

#### 声音的三要素 <img src="/files/LCK29HiLIwdnvoIWuBM5" alt="" data-size="line">

自然界中的声音是由很多种声音组合而成的和声，纯声为正弦波。

> 音调 <img src="/files/UNoBQPrLtuIyPrVXmCWD" alt="" data-size="line"> ：音调高低，指的发声频率的快慢
>
> 音量 <img src="/files/TTYsRCqPsofjhhvZh4fM" alt="" data-size="line"> ：声音大小
>
> 音色 <img src="/files/GWt09h3QbT15fsb7EiCt" alt="" data-size="line"> ：绿色基频，主频率。和声的小谐波，导致不同的音色。音的特质。

#### [模拟信号数字信号转换](https://www.cnblogs.com/traditional/p/12391872.html) <img src="/files/YULymaIoxEn4b2EAE0Ex" alt="" data-size="line"> <img src="/files/zT0uTKjACVHS4JqJrJfW" alt="" data-size="line"> <img src="/files/IqnJ39GS7XhwNKIzhmuv" alt="" data-size="line"> <img src="/files/6eIApGmaZNkvuMMBmMsA" alt="" data-size="line"> <img src="/files/CB19naGqeGNYZ8Wnr7jv" alt="" data-size="line">

#### [PCM与WAV](https://blog.csdn.net/jay103/article/details/86686580)  <img src="/files/BVHSDMhkQwengpQDmDyO" alt="" data-size="line"> <img src="/files/riGk7FJeLe9qoBv2qoWg" alt="" data-size="line"> <img src="/files/WJE26wssqAD3J9YFqeMQ" alt="" data-size="line"> <img src="/files/jv6S6IdlFfEP0BY8duUa" alt="" data-size="line"> <img src="/files/UvXlp289zgEZgZfFT3gn" alt="" data-size="line">

### 第9章 图像的基本概念

#### 视频

> 1、由一组`图像`组成
>
> 2、为了传输/占用更小的空间而被`压缩`
>
> 3、最终在`显示设备`上展示（未被压缩）

#### 图像

> 像素
>
> &#x20;       像素位深：RGB888（24位）、RGBA（32位）
>
> RGB
>
> 分辨率

<table><thead><tr><th width="150">像素</th><th>屏幕</th><th>分辨率（x*y）</th></tr></thead><tbody><tr><td><img src="/files/lF7gO7DeLaeb6Ll1eoeG" alt="" data-size="line"></td><td><img src="/files/Grg6A7AFfARItOBofLNJ" alt="" data-size="line"></td><td><img src="/files/JwnKcpDi5HJ3IT8T1G65" alt="" data-size="line"></td></tr></tbody></table>

#### 图像与显示设备的关系

> 1、图像是数据
>
> 2、屏幕是显示设备
>
> 3、图像数据经过`驱动程序`让屏幕显示图像

#### RGB色彩问题

> 1、RGB与BGR
>
> 2、BMP使用的是BGR格式，需要进行转换。（屏幕驱动默认为RGB，依旧将BGR格式渲染将出问题）

#### 屏幕指标

> 1、PPI （pixels per inch） （每英寸的像素数）
>
> 2、DPI（Dots per inch）(每英寸的点数。可以理解为PPI)
>
> 3、PPI > 300 就是属于视网膜级别（即人眼区分不出像素点，即认为是一块东西）

#### 分辨率

> x轴像素个数  ×  y轴像素个数
>
> 常见的宽高比    16：9      4：3    （拿到非标准宽高比，需要转换成常见宽高比，然后再渲染）
>
> 360P、720P、1K、2P  (都是16：9)

#### 帧率

> 每秒钟采集/播放图像的个数
>
> 动画的帧率：25帧/s
>
> 常见的帧率：15帧/s，30帧/s，60帧/s，

#### 图像清晰程度：分辨率。

#### 视频平滑程度：帧率      （帧率高，采样率高，每一个细节都能捕获到。视频平滑）

#### 未编码视频的RGB码流

RGB码流 = 分辨率（宽×高）×3（Btye）× 帧率（25帧）

> 例如：1280×720×3×25 = 69120000 约69M，（通常按位计算，再成8，=  bits），70×8 = 56兆

#### 图像的显示

> 1、图像大小等于显示区域大小
>
> 2、图像小于显示区域（拉伸/留白）
>
> 3、图像大于显示区域（缩小/截断）

### [YUV](https://zh.wikipedia.org/wiki/YUV)

YUV（也称YCbCr）：Y 表示明亮度，UV的作用是描述影像色彩及饱和度。(之前的黑白电视只读Y值)

&#x20;        主要的采样格式有：YUV4:2:0、YUV4:2:2、YUV4:4:4

| YUV的Y分量                                                         | YUV的U分量（Cb分量，b   blue 蓝）                                        | YUV的V分量（Cr分量， r  red 红）                                         |
| --------------------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------- |
| <img src="/files/w9DZaHsVnvDLl8PGRyJs" alt="" data-size="line"> | <img src="/files/q1cLjHPoHROyMXsWhOMV" alt="" data-size="line"> | <img src="/files/Ni9LLrsKdl9AkL5IQSJK" alt="" data-size="line"> |

电视使用YUV ，电脑手机屏幕 RGB格式。

#### RGB与YUV的关系

> RGB用于屏幕图像的展示
>
> YUV用于采集与编码

### 转换公式

| RGB转YUV                                                                                                                                                               | YUV转RGB                                                                      |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
| <p>Y = 0.299*R + 0.587*G + 0.114*B</p><p>U = -0.147*R - 0.289*G + 0.436*B </p><p>   = 0.492\*(B-Y)</p><p>V = 0.615*R - 0.515*G - 0.100*B </p><p>    = 0.877*(R-Y)</p> | <p>R = Y + 1.140*V</p><p>G = Y - 0.394*U - 0.581*V</p><p>B = Y + 2.032*U</p> |

### 原理表格

YUV在对照片或视频编码时，考虑到人类的感知能力，`允许降低色度的带宽`。

| YUV4:4:4                                                        | YUV4:2:2                                                        | YUV4:2:0                                                                                                                                            |
| --------------------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| <img src="/files/suB8GEmXKWMx7TAXvZnk" alt="" data-size="line"> | <img src="/files/zWQ85C3cfhurzZYjgllA" alt="" data-size="line"> | <img src="/files/7dkGhxmsgHhJoTKqnV0s" alt="" data-size="line">                                                                                     |
| 数据全部存储                                                          | 横行隔一个存一个UV                                                      | <img src="/files/nK4LgK97yxWzsUaiKIAD" alt="" data-size="line">                                                                                     |
| eg:1280×720×3                                                   | <p>eg:</p><p>1280×720+\[1280/2]×720×2 = 2×1280×720  (减 1/3)</p> | <p>eg:</p><p>1280×720+\[1280/2]×\[720/2]×2</p><p>= 3/2 ×1280×720 (减1/2<span data-gb-custom-inline data-tag="emoji" data-code="1f34e">🍎</span>)</p> |

### YUV数据量的计算

`YUV4:2:0` 格式下

> YUV = Y × 1.5
>
> YUV = RGB / 2 &#x20;

#### YUV存储格式

> 1、分层存储 <img src="/files/E2iwtNoM0UDdzhGyzyyW" alt="" data-size="line">
>
> 2、YUV 4:2:0 每四个Y 对应 UV

#### YUV Formats分成两个格式：<img src="/files/wOxjs0G9BtYtNLTZEjT4" alt="" data-size="line">

* 紧缩格式（packed formats）：将Y、U、V值存储成Macro Pixels数组，和[RGB](https://zh.wikipedia.org/wiki/RGB)的存放方式类似。
  * NV12 ： YYYYYYYY UVUV  => YUV420SP
  * NV21 ： YYYYYYYY VUVU => YUV420SP    （安卓）
* 平面格式（planar formats）：将Y、U、V的三个分量分别存放在不同的矩阵中。
  * I420 ： YYYYYYYY UU VV => YUV420P
  * YV12 ：YYYYYYYY VV UU => YUV420P         （IOS）

#### 未编码视频的YUV码流

YUV码流 = 分辨率（宽×高）×1.5（Btye）× 帧率（25帧）
