本系列笔记为博主学习李超老师课程的课堂笔记,仅供参阅
音视频小白系统入门课 音视频基础+ffmpeg原理
绪论
ffmpeg推流 ffplay/vlc拉流 使用rtmp协议
ffmpeg -i <source_path> -f flv rtmp://<rtmp_server_path>
为什么会推流失败?
默认命令行方式可能导致音频和视频不同步
原始是最快的播放速率,修改为
`ffmpeg -re -i <source_path> -f flv rtmp://<rtmp_server_path>` 以原始播放速率播放
为什么清晰度不高?
`-f flv` 会按照默认方式对视频重新进行编码,导致视频质量下降
`ffmpeg -re -i <source_path> -c:v copy -f flv rtmp://<rtmp_server_path>`
环境变量
`PATH` :命令行程序如果不是通过地址指定,将通过`PATH`进行搜索
`PKG_CONFIG_PATH` :`pkg-config`参数在这个环境变量的目录下找库的执行文件和头文件,实际上是找到对应库的`.pc`文件,而`.pc`文件中包含有库和头文件的信息
在`~/.bashrc | ~/.bash_profile`文件中设置Linux | Mac 的环境变量,然后通过`source`命令生效
PKG_CONFIG_PATH
与LD_LIBRARY_PATH
有什么区别?
https://www.cnblogs.com/doubleconquer/p/17862780.html
`pkg-config` 输出的参数最终会被 `gcc/clang` 和 `ld` 使用,但 **它本身不参与链接或运行**。
安装ffmpeg
Mac系统可以直接使用brew
安装,类Unix系统可以使用源码安装,源码安装好处是更加灵活。Windows系统安装稍微复杂
可执行工具:
`ffmpeg`:推流,音视频处理
`ffplay`:拉流,播放流媒体文件
`ffprobe`:侦测多媒体文件格式、基本信息
库:
`libavcodec`:编解码
`libavdevice`:管理设备
`libavfilter`:过滤,特效
`libavformat`:多媒体格式处理
`libavutil`:基本工具
`libpostproc`:没什么用
`libswresmaple`:音频重采样
`libswscale`:视频缩放
默认生成动态库(`.dylib/.so`),也可以生成静态库(`.a`)
为什么有时候ffmpeg编译出来没有ffplay工具?
https://blog.csdn.net/chendongpu/article/details/123688442
应该是旧版本需要手动enable
音频基础
处理流程
共享端:音视频采集(调用API) → 音视频编码
传输
观看端:音视频解码 → 音视频渲染 (调用驱动API)
音频数据流
采集后得到数字信号PCM数据 → 编码器aac/mp3编码 → 压缩后的数据aac/mp3 → 套马甲形成多媒体文件mp4/flv
多媒体文件mp4/flv → 脱马甲(解封装) → 解码 → PCM
为什么要套马甲(封装)?
1. 便于传输和存储:多媒体文件格式(如mp4/flv)提供了标准化的容器,可以同时存储音频、视频、字幕等多种数据
2. 包含元数据:多媒体容器可以存储诸如时长、创建时间、编码格式等重要信息
3. 支持流媒体:特定的容器格式支持流式传输,允许在下载完整文件前就开始播放
4. 同步音视频:容器格式包含时间戳等信息,确保音视频在播放时能够正确同步
音频基础知识
声音:物体振动 → 通过介质传输能量 → 介质刺激耳膜 → 被人脑识别
人类的听觉频率范围(介质振动频率):次声波 20Hz 可听声波 20kHz 超声波
说话:85 — 1100 Hz
声音的三要素 → 波的三要素
音调 → 波的频率 频率较高悦耳
音量 → 波的振幅
音色 → 谐波
什么是谐波?
谐波是在基频(基本频率)上叠加的整数倍频率的波。当一个物体振动时,除了产生基本频率的声波外,还会同时产生2倍、3倍等整数倍频率的波。这些波的叠加形成了独特的音色。
例如:当一根琴弦振动时,除了产生基频(最低频率的声波),还会产生2倍频率(第二谐波)、3倍频率(第三谐波)等。不同乐器发出相同音调的声音听起来不一样,就是因为它们产生的谐波组成不同。
谐波有什么用?
1. 音质优化:在音频处理中,了解谐波可以帮助进行更好的音质调节和优化
2. 音频压缩:某些音频压缩算法会考虑谐波特性来实现更有效的压缩
3. 音色合成:在音乐制作中,通过调整谐波可以创造不同的音色效果
模拟信号经过采样得到数字信号(根据奈奎斯特定理,采样率超过最高频率的2倍不会失真),普遍采样率在48kHz
为什么采样率需要是最高频率的2倍?
1. 重建原始信号:根据奈奎斯特定理,要完整重建一个连续的模拟信号,采样率必须至少是信号最高频率的2倍。这是因为每个周期至少需要两个采样点才能确定一个正弦波的频率和相位。
2. 避免混叠效应:如果采样率低于信号最高频率的2倍,高频信号会被错误地解释为低频信号,这种现象称为"混叠"。这会导致重建的信号失真。
3. 数学证明:假设采样率低于2倍频率,那么在信号重建时,由于采样点不足,同一组采样点可能对应多个不同频率的正弦波,系统无法确定原始信号的真实频率。
4. 实际应用:在实践中,为了保证更好的信号质量,通常会采用更高的采样率,比如音频常用的44.1kHz或48kHz。
位深/采样大小:一个采样用多少bit存放。常用16bit
采样率:采样频率 8k(打电话) 16k 32k 44.1k 48k
声道数:单声道、双声道(人耳)、多声道
码率:采样率 x 声道数 x 位深
PCM格式:裸数据,记录采样信息
WAV格式:封装数据,一般用于封装PCM数据,加上元信息,最主要就是位深、采样率和声道数(以及其他一些大小等)
RIFF 是 WAV 的容器格式,通过分块(Chunk)组织数据,使用小端序存储数字。
大端序(Big-Endian)和 小端序(Little-Endian)是两种不同的字节存储顺序,用于定义多字节数据(如整数、浮点数)在内存或文件中的排列方式。它们的区别主要体现在字节的排列顺序上,直接影响数据的解析和跨平台兼容性。
- 关键块:
"RIFF"
(顶层)、"fmt "
(参数)、"data"
(音频数据)。 - 应用场景:WAV、AVI、WebP 等均基于 RIFF 结构。