目录
概览:
基础知识:
1、Linux 基础知识
2、C语言基础回顾
3、swift 语言(mac)
4、重点:ffmpeg 编译
音频:
1、音频基础知识
2、音频编码原理
3、音频数据的采集
4、AAC/OPUS 编码
视频:
1、RGB/YUV (原始数据和播放器播放的数据都是 YUV,显示器显示的是 RGB,关键怎么转化)
2、H264 编码原理(怎么压缩、压缩比例是多少)
3、视频数据采集
4、H264/H265 编码
5、H264 参数调优
流媒体服务器:
1、nginx
2、SRS (比较成熟的商业方案)
3、CDN 网络
4、RTMP 传输
一、音视频环境基础
1、音视频的应用
- 互动直播系统
- 娱乐直播系统 (我们以这个为背景来介绍)
- 音视频特效
- 音视频剪辑
- 监控系统
最简单的一套直播系统:
常用工具:
ffmpeg:包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。(没有图形界面)
ffplay:依赖于 ffmpeg ,目前最强的一个播放器。
vlc:依赖于 ffmpeg ,有一个图形界面。
直播系统的演示:
一个客户端:将自己的视频流,推送到流媒体服务器上。
另外客户端:将流媒体服务器上的视频流,拉取到自己本地。
- ffmpeg将一个 视频数据 推送到流媒体服务器上:
两种不同的播放方式:
-
ffplay 从流媒体服务器上拉去音视频流 (ffplay 播放流媒体服务器上的视频)
-
ffplay 直接播放本地的视频
结果对比:
1、ffplay 播放流媒体服务器上的视频:会有一定的卡顿,并且有可能播放失败。
2、ffplay 直接播放本地的视频 : 非常流畅
问题:为什么播放流媒体服务器上的视频会发生卡顿、清晰度不高呢?
我们在后面进行解析。
总结:架构模型
2、推流中断与画质不清晰的解决办法
问题1:推流失败
- 时长不对,没有正确的文件大小。
- 是时间戳出现了问题
- ffmpeg 内部将音频和视频分开,按照最快的优先级来进行播放。
- 本来音频和视频是同步播放的,但是ffmpeg 内部的机制导致不同步
解决:给 ffmpeg 加一个参数 (-re)
- re参数:使
效果:可以完整的进行播放了,但是清晰度还是很低。
问题2:清晰度很低
- 我们在进行播放的时候, ffmpeg 的参数 -f flv ,会将视频重新进行编码,导致视频有所损失
解决办法:加一个参数 -c:v copy (含义是不进行重新编码)
总结:这两个问题,虽然看起来加两个参数就可以解决掉,但是我们要深入了解它背后的原理,理解为什么会这样。 这也是这门课的目的。
3、Linux 的基础知识
Vim 教程:详情请看
(1) Linux 当中的环境变量
环境变量的含义:一般是指在操作系统中用来指定操作系统运行环境的一些参数
PATH环境变量: path可理解为是计算机寻找某文件时的路径。(当我们在 bash 当中写下一个命令的时候,他就会到 path 指定的目录下面去寻找)
PKG_CONFIG_PATH:与 pkg_config 命令息息相关。(后面详细介绍)
增加 PATH 值的方式
- 直接另外写一行,以冒号进行分割
- 后面添加 $PATH
PKG_CONFIG_PATH 环境变量的作用:
我们执行 pkg-config 命令的时候, 这个指令会到 PKG_CONFIG_PATH 环境变量 指定的目录下面去寻找对应的文件。
4、Linux 安装ffmpeg
通过源码的方式进行安装 ffmpeg 。
第一步:下载 ffmpeg 的源码 http://ffmpeg.org/download.html
1、通过 ftp 的方式来进行文件下载
2、通过在命令行下面,使用 Git 命令来进行源码下载。
git 下载比较慢的时候,我们使用 ftp 的方式进行下载。
第二步:编译 ffmpeg
./configure --prefix=/usr/local/ffmpeg --enable-debug=3 --disable-static --enable-shared // 配置命令
make-j 4 // 多线程编程(4个核进行编译)
make install // 安装
注意:
-prefix=/usr/local/ffmpeg :指定安装目录
–disable-static --enable-shared :打开动态库,关闭静态库, 默认配置是生成静态库。
报错:nasm/yasm not found or too old. Use --disable-x86asm for a crippled build
分析:yasm是汇编编译器,ffmpeg为了提高效率使用了汇编指令,如MMX和SSE等。所以系统中未安装yasm时,就会报上面错误。
解决错误:安装yasm编译器。安装方法如下:
aptitude install yasm
第三步:添加 ffmpeg bin 文件的目录到 PATH 环境变量当中。
安装好之后:
bin文件里面的内容:
ffmpeg :可以进行推流,音视频的处理
ffplay :可以进行拉流,可以播放本地的音视频文件
ffprobe :侦测本地的文件
include 里面的文件
作用:我们自己使用 ffmpeg 的库,进行二次开发的时候要包含的。
avcodec:进行编解码
avdevice:管理设备
avfilter:各种滤镜
avformat:多媒体文件格式处理
avutil:基本的工具
swresample:音频的重采样。
swscale:视频的缩放
lib 库的分析:
问题:安装完 ffmpeg 工具之后,没有 ffplay 工具怎么解决呢?
留个坑
5、在 windows 下编译 ffmpeg
注意:在windows 下面编译 ffmpeg 有以下的三种方式
(1)cygwin 方式
cygwin :( Cygnus Windows) 是一个软件,安装在 Windows 当中,这个软件模拟了一个 Linux 的系统,然后我们在这个软件上面进行 ffmpeg 的编译。
工作原理:在 cygwin 这一个层次,做了一个Linux 的 API 到Windows API 的转换。 我们在跑程序的时候,调的Linux 的API,其实本质上都是调用的 windows 的API
进行配置
(2)MinGW + MSYS2 (最主用要这种)
MinGW:(Minimalist GNU for Wind ows) 完全模仿了 Linux 的编译工具链,将他们搬到 Windows 上面,只不过他所调用的接口还是windows 的接口。