第一章:音视频环境基础


概览:

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

敬告:本课程基于最新版FFmpeg4.3.1开发,仅供学习参考,不可以直接商用(想直接购买商用源代码的同学,请放弃!)。我将带领大家从以下几个方面来深入剖析ffmpeg4.3:“拿来主义”、“为我所用”。通过学习本课程,您将收获:三大多媒体框架(DirectShow、GStreamer、FFmpeg)简介与分析FFmpeg4.3的开发环境搭建(重要讲解windows下的源码编译及vs2015的环境)ffmpeg.c(4.3.1)源码剖析(分析开源大师们的设计理念和编码技巧)亲手封装私有函数:获取音视频流信息(类似于MediaInfo)、获取实时转码进度(改善用户体验)两套实现代码: MFC和Qt。-------------------------------------------------------------------音视频是一门很复杂的技术,涉及的概念、原理、理论非常多,很多初学者不学 基础理论,而是直接做项目,往往会看到c/c++的代码时一头雾水,不知道代码到底是什么意思,这是为什么呢? 因为没有学习音视频基础理论,就比如学习英语,不学习基本单词,而是天天听英语新闻,总也听不懂。所以呢,一定要认真学习基础理论,然后再学习播放器、转码器、非编、流媒体直播、视频监控、等等。 梅老师从事音视频与流媒体行业18年;曾在永新视博、中科大洋、百度、美国Harris广播事业部等公司就职,经验丰富;曾亲手主导广电直播全套项目,精通h.264/h.265/aac,曾亲自参与百度app上的网页播放器等实战产品。目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想文艺一点的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值