ffmpeg 简介
FFmpeg 是一款免费的、开源的跨平台音视频处理工具,旨在提供高质量、高速度的多媒体处理功能,FFmpeg 设计以流式处理音视频。
FFmpeg 目前已成为业界公认的最强大、最全面的音视频处理工具之一,得到了广泛的应用。绝大多数的音视频相关应用和工具库,都直接或间接地引用了 FFmpeg。
FFmpeg 的开发始于2000年,最初由法国程序员 Fabrice Bellard 发起,后来有越来越多的开源贡献者参与。目前 FFmpeg 由一支由多名开发者组成的团队维护和开发。
音视频开发要掌握图像,视频,音频的基础知识,并学会如何对他们进行采集,渲染,处理,传输等一系列开发和应用。
采集解决了数据从哪里来的问题,渲染解决的是数据怎么崭新的问题,处理解决的是数据怎么加工的问题,传输解决的是数据怎么共享的问题。这里的每一个门类都可以深挖,衍生出一 个个充满技术挑战的话题。
1、音视频基础
1.1 音频基础知识
-
如何采集声音-模数转换原理
-
为什么高品质音频采样率>=44.1Khz
-
什么是PCM
-
一个采样点用多少位表示
-
采样值用整数还是浮点数表示
-
音量大小和采样值大关系
-
多少个采样点作为一帧数据
-
左右通道的采样数据如何排列
-
什么是PCM(脉冲编码调制)
-
音频编码原理
1.2 视频基础知识
-
RGB彩色原理
-
为什么需要YUV格式
-
什么是像素
-
分辨率、帧率、码率
-
YUV数据存储格式区别
-
YUV内存对齐问题
-
为什么画面显示绿屏
-
H264编码原理
-
H264 I P B帧的关系
1.3 解复用基础知识
-
什么是解复用,比如MP4格式
-
为什么需要不同的复用格式MP4/FLV/TS
-
常见的复用格式MP4/FLV/TS
1.4 FFmpeg6.0开发环境搭建
-
Windows、Ubuntu、MAC三大平台
-
QT安装
-
FFmpeg命令行环境
-
FFmpeg API环境
-
FFmpeg编译
-
vs2019安装(win平台)
1.5 音视频开发常用工具
-
MediaInfo,分析视频文件
-
VLC播放器,播放测试
-
EasyICE,分析TS流
-
flvAnalyser,分析FLV
-
mp4box,分析mp4
-
audacity,分析音频PCM
-
Elecard_streamEye,分析H264
-
海康YUVPlayer,分析YUV
2、FFmpeg6.0基石
2.1 FFmpeg命令
-
音频PCM/AAC文件提取
-
视频YUV/H264文件提取
-
解复用、复用
-
音视频录制
-
视频裁剪和合并
-
图片/视频转换
-
直播推流和拉流
-
水印/画中画/九宫格滤镜
注:掌握FFmpeg的目的: 1.快速掌握FFmpeg能做什么; 2.加深对音视频的理解。
2.2 SDL跨平台多媒体开发库实战
-
SDL环境搭建
-
SDL事件处理
-
SDL线程处理
-
视频YUV画面渲染
-
音频PCM声音输出
注:SDL兼容Win、Ubuntu、Mac三大平台, 主要用于后续项目的画面显示和声音输出
2.3 FFmpeg基石精讲
-
FFmpeg框架
-
FFmpeg内存引用计数模型
-
解复用相关AVFormat XXX等
-
编解码相关AVCodec XXX等
-
压缩数据AVPacket
-
未压缩数据AVFrame
-
FFmpeg面向对象思想
-
Packet/Frame数据零拷贝
注:目的熟悉FFmpeg常用结构体和函数接口
2.4 FFmpeg音视频解复用+解码
-
解复用流程
-
音频解码流程
-
视频解码流程
-
FLV封装格式分析
-
MP4封装格式分析
-
FLV和MP4 seek有什么区别
-
为什么FLV格式能用于直播
-
为什么MP4不能用于直播
-
MP4能否用来做点播
-
AAC ADTS分析
-
H264 NALU分析
-
AVIO内存输入模式
-
音频重采样实战
-
重采样后的数据播放时长是否一致
-
重采样后PTS如何表示
-
视频解码后YUV内存对齐问题
-
音频解码后PCM排列格式问题
-
硬件解码dxva2/nvdec/cuvid/qsv
-
硬件gpu数据转移到cpu
-
H265解码
注:FFmpeg API学习:视频解复用 -> 解码 -> 编码 -> 复用合成视频
2.5 FFmpeg音视频编码+复用合成视频
-
AAC音频编码
-
H264视频编码
-
PCM+YUV复用合成MP4/FLV
-
H264编码原理
-
IDR帧和I帧区别
-
动态修改编码码率
-
GOP间隔参考值
-
复用合成MP4音视频不同步问题
-
编码、复用timebase问题
-
MP4合成IOS不能播放问题
-
重采样后PTS如何表示
-
视频编码YUV内存对齐问题
-
硬件编码dxva2/nvenc/cuvid/qsv
-
H265编码原理
-
H264、H265编码互转
3、FFmpeg6.0进阶
3.1 FFmpeg过滤器
-
FFmpeg过滤chain框架
-
音频过滤器框架
-
视频过滤器框架
-
多路音频混音amix
-
视频水印watermark
-
视频区域裁剪和翻转
-
视频添加logo
注: filter在视频剪辑领域应用广泛。
3.2 ffplay播放器
-
掌握ffplay.c的意义
-
ffplay框架分析
-
解复用线程
-
音频解码线程
-
视频解码线程
-
声音输出回调
-
画面渲染时间间隔
-
音频重采样
-
画面尺寸格式变换
-
音频、视频、外部时钟同步区别
-
以视频为基准时音频重采样补偿
-
音量静音、调节大小的本质
-
音视频packet队列大小限制
-
音视频packet队列线程安全
-
音视频frame队列大小限制
-
音视频frame队列线程安全
-
暂停、播放实现机制
-
seek播放导致的画面卡住问题
-
seek播放数据队列、同步时钟处理
-
如何做到逐帧播放
-
播放器退出的流程要点
注: ffplay.c是ffplay命令的源码,掌握ffplay 对于我们自己开发播放器有事半功倍的效果。
4、FFmpeg6.0流媒体项目实战
4.1 FFmpeg+QT播放器
1.开源播放器分析
-
自研框架分析
-
播放器模块划分
-
解复用模块
-
音视频解码
-
播放器控制
-
音视频同步
-
软件解码+硬件解码
-
音量控制
-
变速播放
-
拖动跳转播放
-
画面亮度、饱和度调节
-
画面4:3 16:9切换
-
码流信息分析
-
画面旋转、翻转
-
支持截屏
项目意义:掌握播放器的开发,包括播放器框架分析、 模块设计、队列设计、音视频同步、变速、拖动播放 等核心机制。
4.2 FFmpeg RTMP录制+推流项目
-
RTMP协议简介
-
录制+推流框架分析
-
麦克风、系统声音捕获
-
声音捕获延迟分析和解决
-
摄像头、屏幕画面捕获
-
画面捕获延迟分析和解决
-
音频重采样
-
视频scale
-
AAC编码器封装
-
H264编码器封装
-
音频编码参数优化
-
视频编码画质/CPU/码率/延迟优化
-
音频、视频采集时如何设置时间戳
-
采集-编码-推流时间戳转换
-
将音频、视频保存为MP4文件
-
采集-编码-保存mp4时间戳转换
-
支持推流画面预览
-
如何支持H265推流
-
如何支持麦克风和系统声音混音
-
实现音频采集降噪
-
RTMP推流是否会导致延迟
-
RTMP推流如何动态调整码率
-
RTMP推流如何动态调整帧率
-
Web端能否拉取RTMP推流
项目意义: 本项目推流模块采用FFmpeg API,不需要深入理解 RTMP协议仍然能实现推流直播。 掌握推流框架和视频录制框架,包括音视频采集、模块划分、 音视频同步、编码优化、推流延迟等核心技术。
4.3 FFmpeg RTMP拉流+录像项目
-
RTMP协议简介
-
拉流+录像框架分析
-
拉流模块封装
-
AAC解码模块封装
-
H264解码模块封装
-
包队列设计
-
帧队列设计
-
实现音视频同步
-
能否不做音视频同步分析
-
没有MetaData能否播放
-
RTMP拉流是否会导致延迟
-
如何检测RTMP拉流延迟
-
如何解决RTMP播放延迟
-
添加支持变速播放
-
变速播放策略分析和设置
-
秒开功能原理分析与实现
-
ffplay、vlc能否用来测试播放延迟
-
实现拉流、保存视频为MP4
-
拉流、保存MP4时间戳转换
注: 掌握RTMP直播拉流+录像框架,包括拉流、队列设计、音视频同步、低延迟、保存为MP4文件等核心技术。
4.4 RTSP推流+录制项目
-
RTSP协议简介
-
基于RTMP推流项目实现RTSP推流+录制
项目意义: 本项目推流模块采用FFmpeg API,不需要深入理解 RTSP协议仍然能实现推流直播。 掌握推流框架和视频录制框架,包括音视频采集、模块划分、 音视频同步、编码优化、推流延迟等核心技术。
4.5 RTSP拉流+录像项目
-
RTSP协议简介
-
基于RTMP拉流项目实现RTSP拉流+录像
注: 掌握RTSP拉流+录像框架,包括拉流、队列设计、音视频同步、低延迟、保存为MP4文件等核心技术。
5、项目实践
5.1自研项目和源码分析
-
SDL音频播放
-
SDL视频播放
-
FFmpeg内存引用计数
-
MP4/FLV/TS解复用
-
提取H264
-
提取AAC
-
H264/H265解码
-
AAC/MP3解码
-
AVIO内存输入模式
-
音频重采样
-
视频尺寸格式变换
-
DXVA2解码
-
NVDEC解码
-
CUVID解码
-
QSV解码
-
AAC编码优化
-
H264编码优化
-
H265编码优化
-
AAC转MP3
-
H264转H265
-
DXVA2编码
-
NVENC编码
-
CUVID编码
-
QSV编码
-
MP4合成
-
FLV合成
-
多路音频混音
-
视频添加水印
-
视频区域裁剪
-
视频翻转
-
视频添加logo
-
ffplay播放器
-
自研 QT播放器
-
RTMP推流
-
RTMP拉流
-
RTSP推流
-
RTSP推流
-
HLS拉流
6、学习方法
-
先看文档再看视频
-
先把课程代码运行调试,然后修改调试,最后自己尝试重写
-
每节课的知识点总结成技术博客(每月有博客大赛,有奖金支持)
-
课程与工作相结合,重新思考需求功能
-
不理解的技术点 跟老师沟通
-
偏音视频客户端方向:服务器相关的内容以了解为主,比如SRS流媒体服务器,主要是理解推拉流框架、协议转换逻辑,不需要投入太多的时间阅读源码。
-
偏流媒体服务器方向:涉及到UI界面的设计以了解为主,比如播放器项目只需要专注于音视频相关的内容。
【学习地址】: FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击 1079654574加群领取哦~
FFmpeg 学习书籍
《FFmpeg从入门到精通》是一本介绍FFmpeg的实战技术指南,全书共10章,分为两个部分。部分(第1~7章)为FFmpeg的命令行使用篇,介绍了FFmpeg的基础组成部分、FFmpeg工具使用、FFmpeg的封装操作、FFmpeg的转码操作、FFmpeg的流媒体操作、FFmpeg的滤镜操作、FFmpeg的设备操作。
第二部分(第8~10章)为FFmpeg的API使用篇,介绍了FFmpeg封装部分的API使用操作、FFmpeg编解码部分的API使用操作,FFmpeg滤镜部分的API使用操作,相关操作均以实例方式进行说明,包括新API及旧API的操作。
本书适合从事多媒体服务器端开发的工程师,嵌入式视频处理工程师。本书也适合作为计算机专业本科生和研究生,尤其是多媒体研究方向作为参考用书。
还有一本网上流传的 <<ffmpeg源码解析>>pdf版本,然后目前我就没看到其他关于ffmpeg的书籍了;这里多说一句,不同版本的ffmpeg,api可能不太一样,具体细节,各位可以去ffmpeg官网查看手册说明即可!