FFmpeg基础学习路线

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官网查看手册说明即可!

猜你喜欢

转载自blog.csdn.net/irainsa/article/details/130609379