前言:随着5G的普及,将会改变人与人、人与物、物与物之间的沟通方式。以后图文沟通的方式会越来越少,而音视频则将成为主流。这也催生出大量的音视频相关需求。但目前具备音视频开发技术的开发者,可谓是少之又少。而且,现在音视频工程师的薪资比纯Android应用层开发高出40%。
为什么要学习音视频开发技术?
- 开发薪水:在BOOS直聘公开统计中,音视频行业的工资10k-20k占12%,20k-30k占45%,30k占35%,35k以上占13%。主要分布在20k-35k之间,想要取得一个不错的薪资,如果只是简简单单开发四大组件是不可能拿到这么高薪资的。音视频开发薪资这么高主要就是因为音视频技术人才非常稀缺,很少有人会完整的音视频开发。
- 就业机会:就业场景分布广。之前学习了音视频高手课的200多位学员就职于全国各大公司。从事音视频相关产品开发
- 开发前景:随着5G落地,音视频在互联网中的比重越来越高,5G宽带的提速,必然加速整个音视频领域的应用,未来音视频人才缺口达30万,音视频高端领域严重短缺
像前几年,我们70%-80%的应用都是在网络请求、UI界面、文字、图片上;在以后,95%的应用场景主要是来自于计算机视觉领域,计算机视觉领域又是跟音视频相关性非常大的领域。所以,未来音视频开发领域绝对是一个风口,是一片蓝海
音视频开发行业的现状
- 核心竞争力:音视频是程序界的皇冠,掌握音视频意味着拿到通往未来的船票,不用担心会被其他人替代。因为音视频是有一定门槛的,所以也是与其他人拉开差距的分水岭。
- 高端人才相当缺乏:BOOS直聘中,北上广深很多年薪50W-70W的音视频开发岗位,常年招不到人,月薪2-3万大多是刚从事音视频的入门级开发者
- 技术迭代慢:H264编码从1995年成为标准至今一直都在使用,属于比较偏底层的技术,而底层技术几十年都不会有太大的改变。
如果大家再仅仅是停留在简简单单的四大组件、UI、网络这一块,可替代性是非常高的。
音视频流媒体
而如今音视频的知识纷繁复杂,自己学习非常困难,既需要非常扎实的基础知识,又需要有很多的工程经验;而音视频从业者基本上有两个层面:一个层面是搞音视频算法,这类人非常少,需要有深的数学能力和算法背景,这类人一般都会选择去大公司,薪水百万是最low的。
还不熟悉的朋友,这里可以先领取一份音视频开发新手学习资料包(入坑不亏)
本文介绍下C++音视频开发从入门到高级进阶的学习路线,整个学习路线,直接对标c++音视频开发岗位,知识点包括音视频基础、FFmpeg实战、流媒体客户端、流媒体服务器、WebRTC实战、Android NDK、IOS音视频等等 。其次你把整个内容,全部消化,是完全可以胜任任何音视频开发招聘,嵌入式音视频开发招聘。
什么是音视频开发
音视频开发是指涉及音频和视频处理、编解码、传输、存储等方面的软件开发领域。它包括了实时音视频通信、流媒体服务、多媒体应用程序等内容。
在音视频开发中,常见的任务包括音频采集与录制、音频编解码、音频处理与增强(如降噪、消除回声等)、视频采集与录制、视频编解码、图像处理与分析等。此外,还需要关注实时传输和流媒体协议(如RTP/RTCP, RTMP, HLS)的使用,以及存储和播放相关技术。
在这个领域中,开发者通常会使用各种语言和框架来实现不同功能,例如C/C++、Java、Python以及相关库和工具,如FFmpeg, GStreamer, WebRTC等。通过掌握相关技术和工具,可以开发出高质量的音视频应用程序或服务。
1音视频开源项目
部分音视频开源项目发布时间,每个开源项目之所以能成功都是经过了开发者长期的时间投入。
- 1.2001年FFmpeg多媒体视频处理开源项目
- 2.2009年WebRTC开源项目发布
- 3.2013年SRS流媒体服务器(Simple-RTMP-Server) 发布版本
- 4.2013年ijkplayer手机播放器发布
- 5.2014年OBS开源项目(支持WebRTC, 早期支持的是RTMP)(GitHub可查最 早时间)
- 6.2015年Janus WebRTC流媒体服务器发布版本
- 7.2015年QMPlay2 PC QT (调用FFmpeg的接口,硬解接口, OpenGL)播放器发布
- 8.2017年ZLMediaKit流媒体服务器发布版本
2.音视频应用领域
各类活动场景都在不断加深线上开展业务的方式,有人的业务场景基本.上都需要音视频技术。
3.FFmpeg零基础入门:如何快速入门,需要哪些知识点?
- windows ffmpeg命令行环境搭建
- FFMPEG如何查询命令帮助文档
- ffmpeg音视频处理流程
- ffmpeg命令分类查询
- ffplay播放控制
- ffplay命令选项
- ffplay命令播放媒体
- ffplay简单过滤器
- ffmpeg命令参数说明
- ffmpeg命令提取音视频数据
- ffmpeg命令提取像素格式和PCM数据
- ffmpeg命令转封装
- fmpeg命令裁剪和合并视频
- fmpeg命令图片与视频互转
- ffmpeg命令视频录制
- ffmpeg命令直播
- ffmpeg过滤器-裁剪
- ffmpeg过滤器-文字水印
- ffmpeg过滤器-图片水印
- ffmpeg过滤器-画中画
- ffmpeg过滤器-多宫格
FFmpeg零基础入门Q群1106675687《进群获取》。
音视频高级开发
1.音视频基础
(一)音频基础知识
- 如何采集声音-模数转换原理
- 为什么高品质音频采样率>=44.1 Khz
- 什么是PCM
- 一个采样点用多少位表示
- 采样值用整数还是浮点数表示
- 音量大小和采样值大关系
- 多少个采样点作为一-帧数据
- 左右通道的采样数据如何排列
- 什么是PCM (脉冲编码调制)
- 音频编码原理
(二)视频基础知识
- RGB彩色原理
- 为什么需要YUV格式
- 什么是像素
- 分辨率、帧率、码率
- YUV数据存储格式区别
- YUV内存对齐问题
- 为什么画面显示绿屏
- H264编码原理
- H264IPB帧的关系
注:具体H264编码格式见FFmpeg章节
(三)解复用基础知识
- 什么是解复用,比如MP4格式
- 为什么需要不同的复用格式
- MP4/FLV/TS
- 常见的复用格式MP4/FLV/TS
注:具体复用格式详解见FFmpeg章节
(四)FFmpeg开发环境搭建
- Windows、Ubuntu、MAC3三大平台
- QT安装
- FFmpeg命令行环境
- FFmpeg API环境
- FFmpeg编译
- vs2019安装(win平台)
(五)音视频开发常用工具
- Medialnfo,分析视频文件
- mp4box,分析mp4
- VLC播放器,播放测试
- audacity,分析音频PCM
- EasyICE,分析TS流
- Elecard_ streamEye, 分析H264
- flvAnalyser,分析FLV
- 海康YUVPlayer,分析YUV
2.FFmpeg实战
(一)FFmpeg命令
- 音频PCM/AAC文件提取
- 视频YUV/H264文件提取
- 解复用、复用
- 音视频录制
- 视频裁剪和合并
- 图片/视频转换
- 直播推流和拉流
- 水印/画中画/九宫格滤镜
注:掌握FFmpeg的目的
- 1.快速掌握FFmpeg能做什么;
- 2.加深对音视频的理解
(二)SDL跨平台
- 多媒体开发库实战
- SDL环境搭建
- SDL事件处理
- SDL线程处理
- 视频YUV画面渲染
- 音频PCM声音输出
注: SDL兼容Win、Ubuntu、Mac三大平台,主要用于后续项目的画面显示和声音输出
(三)FFmpeg基石精讲
- FFmpeg框架
- FFmpeg内存引|用计数模型
- 解复用相关AVFormat XXX等
- 编解码相关AVCodec XXX等
- 压缩数据AVPacket
- 未压缩数据AVFrame
- FFmpeg面向对象思想
- Packet/Frame数据零拷贝
注:目的熟悉FFmpeg常用结构体和函数接口
(四)FFmpeg过滤器
- FFmpeg过滤chain框架
- 音频过滤器框架
- 视频过滤器框架
- 多路音频混音amix
- 视频水印watermark
- 视频区域裁剪和翻转
- 视频添加logo
(五)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学习:视频解复用->解码->编码->复用合成视频
(六)ffplay播放器
- 掌握ffplay.c的意义
- ffplay框架分析
- 解复用线程
- 音频解码线程
- 视频解码线程
- 声音输出回调
- 画面渲染时间间隔
- 音频重采样
- 画面尺寸格式变换
- 音频、视频、外部时钟同步区别
- 以视频为基准时音频重采样补偿
- 音量静音、调节大小的本质
- 音视频packet队列大小限制
- 音视频packet队列线程安全
- 音视频frame队列大小限制
- 音视频frame队列线程安全
- 暂停、播放实现机制
- seek播放导致的画面卡住问题.
- seek播放数据队列、同步时钟处理
- 如何做到逐帧播放
- 播放器退出的流程要点
注: ffplay.c是ffplay命 令的源码,掌握fplay对于我们自己开发播放器有事半功倍的效果
(七)FFmpeg音视频编码+复用合成视频
- AAC音频编码
- H264视频编码
- PCM+ YUV复用合成MP4/FLV
- H264编码原理
- IDR帧和帧区别
- 动态修改编码码率
- GOP间隔参考值
- 复用合成MP4音视频不同步问题
- 编码、复用timebase问题
- MP4合成IOS不能播放问题
- 重采样后PTS如何表示
- 视频编码YUV内存对齐问题
- 硬件编码dxva2/nvenc/cuvid/qsv
- H265编码原理
- H264、H265编码互转
(八)ffmpeg多媒体
- 视频处理工具
- 掌握fmpeg.c的意义
- ffmpeg框架分析
- 音视频编码
- 封装格式转换
- 提取音频
- 提取视频.
- logo叠加
- 音视频文件拼接
- filter机制
- 命令行解析流程
- MP4转FLV不重新编码逻辑
- MP4转FLV重新编码逻辑
- MP4转FLV scale
注: ffmpeg.c是ffmpeg命令的源码,掌握ffmpeg.c的大体框架对于我们要实现一些不知道怎么编写代码的功能(用ffmepg命令行可以但不知道怎么调用ffmpeg api时可以参考ffmepg.c的逻辑)有极大的帮助,比如要裁剪视频长度。
(九)FFmpeg+ QT播放器
- 常见开源播放器分析
- CUVID/D3D11VA硬解
- 界面和播放核心分离框架分析
- 音量频谱展示
- 播放器模块划分
- 音频均衡器
- 解复用模块
- 画面旋转、翻转
- 音视频解码
- 画面亮度、饱和度调节
- 播放器控制
- 画面4:3 16:9切换
- 音视频同步
- 码流信息分析
3.流媒体客户端
(一)RTMP推拉流项目实战
- RTMP协议分析
- wireshark抓包分析
- H264 RTMP封装
- AAC RTMP封装
- RTMP拉流实战
- H264 RTMP解析
- AAC RTMP解析
- RTMP推流实战
- 0没有MetaData能否播放
- RTMP推流是否会导致延迟
- RTMP推流如何动态调整码率
- RTMP推流如何动态调整帧率
- RTMP拉流是否会导致延迟
- 如何检测RTMP拉流延迟
- 如何解决RTMP播放延迟
- ffplay. vlc能否用来测试播放延迟
- ffplay、vlc能否用来测试播放延迟
- RTMP拉流播放变速策略设置
(二)RTSP流媒体实战
- RTSP协议分析
- RTP协议分析
- H264 RTP封装
- H264 RTP解析
- AAC RTP封装
- AAC RTP解析
- RTCP协议分析
- RTSP流媒体服务器搭建
- RTSP推流实战
- RTSP拉流实战
- wireshark抓包分析
- RTP头部序号的作用
- RTCP的NTP和RTP的TS的区别
- RTP头部序号的作用
- RTCP的NTP和RTP的TS的区别
- RTSP交互过程
- 花屏可能的原因
- SPS PPS如何发送
- SDP封装音视频信息
(三)HLS拉流分析
- HLS协议分析
- HLS拉流实战
- HTTP协议分析
- FFmpeg HLS源码分析
- TS格式分析
- HLS多码率机制
- m3u8文件解析
- 如何解决HL S延迟高的问题
- wireshark抓包分析
注:理解HL .S的拉流机制,有助于我们解决HL .S播放延迟较高的问题
4.流媒体服务器
(一)SRS源码剖析协程
- 整体框架分析
- 连接和协程的关系
- RTMP推流分析
- 如何更快速掌握SRS源码
- RTMP拉流分析
- 流媒体服务器是否导致延迟
- HLS拉流分析
- 如何降低流媒体服务器的延迟
- HTTP-FLV拉流分析
- 怎么获取流媒体服务器推流信息
- FFmpeg转码分析
- 怎么获取流媒体服务器拉流信息
- 首屏秒开技术分析
- 首屏秒开能降低延迟吗
- forward集群源码分析
- 推流->服务器转发->拉流延迟分析
- edge集群源码分析
- 负载均衡部署方式
注:对于SRS流媒体服务器,我们长期更新,从3.0->4.0->5.0
(二)ZLMediaKit源码剖析
- 整体框架分析
- 数据转发模型
- 线程模块划分
- SDP解析
- RTSP推流连接处理
- RTP H264解析
- RTSP拉流连接处理
- RTP AAC解析
注: ZLMediaKit主要讲解RTSP流媒体服务器相关的模块,其他模块RTMP/HLS等参考SRS。
5.WebRTC项目实战
(一)WebRTC中级开发手把手写代码
- WebRTC通话原理分析
- WebRTC开发环境搭建
- coturn最佳搭建方法
- 如何采集音视频数据
- 一对一通话时序分析
- 信令服务器设计
- SDP分析
- Candidate类型分析
- Web-对一通话
- Web和Android通话
- AppRTC快速演示
- 如何设置编码器优先级
- 如何限制最大码率
- 信令服务器的本质是什么
- Web和Android的SDP差异
- A要和B通话, A怎么知道B的存在
- 新增C++、IOS客户端两大版本
注:学习WebRTC建议从web端入手,可以直接调用js接口(千万别刚接触WebRTC就忙着去编译WebRTC源码) , 对WebRTC通话流程有清晰的理解再考虑其他端。
(二)WebRTC高级开发-SRS 4.0/5.0源码分析
- RTMP转发WebRTC逻辑
- WebRTC转发RTMP逻辑
- WebRTC音视频一对一通话
- WebRTC多人通话
- WebRTC SFU模型分析
- SRTP分析
- RTCP分析
- SDP分析
- NACK分析
- turn分析
- stun分析
- 拥塞控制算法
- FEC
- jitter buffer
(三)WebRTC高级开发-MESH模型多人通话
- 自定义摄像头分辨率
- 码率限制
- 调整编码器顺序
- Mesh模型多方通话分析
- 多人通话信令服务器开发
- 动态分配stun/turn服务器
- Web客户端源码
- Android客户端源码
(四)WebRTC高级开发-Janus SFU模型多人通话
- Janus框架分析
- Janus信令设计
- 基于Janus实现会议系统
- Janus Web客户端源码分析
- Janus Android客户端源码分析
- Janus Windows客户端源码分析
- 基于Full ICE的部署
- 基于Lite ICE的部署
- Full ICE和Lite ICE的区别
- 发布订阅模型
6.Android NDK
(一)Android NDK开发基础
- So库适配总结
- GDB调试技巧
- Makefile_ I程组织
- CMake工程组织
- 生成指定CPU平台的so库
- JNI基础和接口生成
- JNI Native层构建Java对象
- JNI异常处理
(二)Android FFmpeg编译和应用
- 编译x264
- 编译x265
- 编译mp3
- 编译fdk-aac
- 编译FFmpeg
- 使用ffmpeg实现mp4转格式
- 使用FFmpeg开发播放器
(三)Android RTMP推拉流
- RTMP推流协议实现
- RTMP拉流协议实现
- RTMP拉流音视频同步
- MediaCodec硬件编码
- MediaCodec硬件解码
- OpenSL ES播放音频数据
- MediaCodec硬件解码
- OpenGL ES Shader显示视频
(四)Android Ijkplayer源码分析
- 编译jkplayer和实践
- 项目框架分析
- 播放状态转换
- 拉流分析
- 解码分析
- 音频播放流程
- 视频渲染流程
- OpenSL ES播放音频数据
- MediaCodec硬件解码
- OpenGL ES Shader显示视
- 变速播放实现原理
- 低延迟播放实现
- 缓存队列设计机制分析
7.IOS音视频开发
(一)IOS FFmpeg6.0编译和应用
- xcode调试FFmpeg
- IOS调用FFmpeg
- QT调试FFmpeg
(二)IOS FFmpeg RTMP推拉流
- AVFoundation视频采集
- Metal视频渲染
- Audio Unit音频采集
- Audio Unit音频播放
- FFmpeg推流
- FFmpeg拉流
- 直播延迟和解决方法
(三)VideoToolbox硬件编解码
- VideoToolbox框架的流程
- 硬件编解码步骤
- CVPixelBuffer解析
- 如何获取SPS/PPS信息
- 判断是否关键帧
- 编码参数优化
(四)IOS jkplayer编译和应用
- 本地视频播放
- RTMP拉流播放
- HTTP点播
- 音频播放流程
- 视频渲染流程
(五)IOS ijkplayer编译和应用
- 基于Mesh一对一通话
- 基于SFU多人通话
音视频项目实战
1.0voice播放器
支持播放/暂停,上一/下一视频,变速播放,文件seek播放进度显示,截屏,调节音量,播放列表,显示缓存时间实现直播低延迟播放
2.0voice录制推流软件
支持屏幕+麦克风RTMP直播,支持本地文件推送;支持录制保存到本地,支持录制预览功能,支持添加图片水印功能;支持文字水印功能,支持屏幕+摄像头同时捕获,支持降噪功能。
3.0voice低延迟拉流直播
实现500毫秒~1秒的低延迟直播
帮助大家全面掌握FFmpeg的核心技术点:
- 本课程为音视频全栈开发技术提升体系
- 原理,源码分析,案例分析,项目实战全包含
- 详细技术点参考音视频第6代课程大纲
- 全新升级FFmpeg6.0-全网唯一
适宜工程师人群(本课程涵盖最主流的音视频全栈开发技术,适合各类技术人员)
- 从事音视频岗位开发,但没有时间系统学习的在职工程师
- 从事嵌入式方向开发,想转入音视频开发的在职工程师
- 从事Qt/MFC等桌面开发的,薪资多年涨幅不大的在职工程师
- 从事Android/IOS移动开发,想往音视频方向发展的在职工程师
- 从事C/C+ +后台开发,想往流媒体服务器方向发展的在职工程师
- 自己研究学习速度较慢,不能系统构建音视频知识体系的开发人员
- 计算机相关专业想进入大厂的在校生(本科及以上学历,有c/C+ +基础)
音视频自学难点音视频自学非常困难,网上通俗易懂的难找到。
网上部分资源是对应的开源版本较低,比如雷霄骅(雷神)博客的FFmpeg版本较低
音视频涉及大量的开源库和协议:
- 1、比如ffmpeg的编译,如果不熟悉各种编译报错
- 2、Janus编译涉及各种开源组件编译不通过
- 3.比如WebRTC涉及的RTP、RTCP、SDP、STUN等协议
部分嵌入式音视频的朋友技术面窄, 技术不深入
比如有同学做了2年的音视频驱动, 一帧音频能持续播放多久都不明白。
系统学习课程咨询,扫码添加秋香老师(备注ysp)领取专属优惠券。
至于学习效果怎么样?👇
webrtc入门到精通
- (1)WebRTC入门
- (2)WebRTC开发环境搭建
- (3)Coturn穿透和转发服务器搭建
- (4)音视频采集和播放
- (5)Nodejs实战
- (6)手把手实现音视频一对一通话(包含信令协议设计、Web to Web、Android to Web、 Android to Android)
- (7)开源方案介绍
- (8)AppRTC开源方案搭建
自学的弊端:网上资料繁杂,知识零碎,看过之后容易很快就忘掉,遇到问题只能自己钻研,有些很简单的问题不知不觉就浪费了很多时间,除非你是定力耐心毅力非常强的人,不然学习起来会没有方向感,盲目的看书枯燥乏味耗时比较长,会导致没有学习积极性失去信心与坚持下去的决心等等。总的来说自学不能说完全不行,只是适合少数人,自学的难度比报班系统学习一定是困难很多很多倍,多付出很多很多倍的。
反之报班学习的优势在于:
节约时间,知识串联:视频学习老师会提取知识点讲解出来比看书快了很多倍,并且理解起来比枯燥乏味的读书更有意思,尤其计算机相关的理论知识更是繁琐复杂交错依附,报班会让你更加系统的学习,知道前因后果来龙去脉,老师会把知识串联起来交给你,配套的资料发给你,而不是独立零散的知识点学习,对于提升来说,是高效且快速的。
老师答疑:遇到不懂得问题,老师会在自己看到的第一时间给到解答,24小时的答疑服务,会大大节约了你的学习时间。老师在知识体系,课程内容上,简历书写,面试指导,谈薪技巧等等方面都有着丰富的经验,课程内容也是由简到难,源码分析勾画重点,不做无用功,会提供配套的学习资料,图文并茂,讲解上通俗易懂,技术慢慢深入串联,学员通过和老师的沟通交流从而轻松学习,来达到自己想要达到的目标。
时间自由学习高效:很多在职的开发人员除了日常上班大部分时间还要加班,对于提升自己都是挤时间,没有完整的学习时间,这样其实给自学增添了很大的难度,跟着视频学习每日定好进度下班以后有固定的学习时间学习内容,或者周末抽几个小时整时间学习,有方向感且高效。
要说报班学习的弊端,那我只能想到一个,就是会有金钱上的一个付出,但是技术学会了是会跟随你一辈子的,现在的付出可能就是以后你一个月的涨薪部分,这个账怎么算都不会亏。投资自己 是风险最低 收益最高的,在大环境中安于现状才是井底之蛙,不断学习提升自己才是程序员最需要做的,提升工作竞争力,让自己在现在的公司被需要!
现如今各行各业内卷都很严重,不要说行业不行,而是大家越来越专业,这个是行业发展的必然性,优胜劣汰适者生存,时代在改变,不提高自己的核心竞争力就要出局。
最后:
给校招的小伙伴一句话:第一份工作不亚于一次高考,珍惜校招,社招的竞争是你目前想象不到的。能去大厂觉不妥协,IT行业第一份工作背景越好,起点越高,后续发展空间越好!
给那些1-3年的安于现状的伙伴一句话:
不要抱怨市场,不要安于现状,在低端,往中端领域看,在中端往高端领域看。认知以及对自身的要求,都会有所改变。
给那些担心35岁的伙伴一句话:
决定上限的不是年纪,而是技术。最后:希望学习路线对你有所帮助,希望码农的我们越来越好!