第一章:音视频环境基础

目录


概览:

基础知识:
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 的接口


(3)VS + MSYS2

上一篇:【FFmpeg】ffplay 播放视频命令 ( 播放 | 暂停 | 停止 | 音量控制 | 进度控制 | 音频流 / 视频流 / 字幕流 / 节目切换 )


下一篇:LAL-开源Go语言音视频流媒体服务器