C/C++音视频开发技术要点与学习路线
总体来讲,音视频开发是有一定的技术门槛的,我觉得至少需要在这个领域踏踏实实积累个3-5年,才能对音视频相关的开发知识有一个整体、深刻的理解。
从技术上来讲,需要从如下两个大类知识点上去积累:
1. C/C++通用开发知识
音视频开发的主要编程语言就是C和C++。
这块的专业知识积累是通用的,并不局限于某个特定的行业,属于程序员的技术功底。
可以重点关注如下几个方面:
- 计算机系统的底层工作原理
- 操作系统原理
- 程序的编译、链接和加载机制
- C/C++语言特性背后蕴含的思想,底层工作原理,适用场景,存在什么样的问题
- 软件设计原则和设计模式
- 数据结构和算法
- 多线程并发编程原理
- 网络编程
- 跨平台
- 操作系统API
- 软件调试
2. 音视频领域专业知识
这块属于从事音视频行业的专业知识。
这块的专业知识是非常多的,每个功能模块背后涉及很多专业的知识。
音视频的开发可以分为两大块,涉及的内容大致如下:
- 音视频客户端开发
- 客户端应用开发
- 音视频引擎开发
- 音视频引擎SDK
- 音视频引擎框架
- 音视频引擎功能模块
- 音/视频采集
- 音/视频渲染
- 音/视频数据处理
- 音/视频编/解码
- 录制
- 串流
- 音视频同步
- 流媒体服务器开发
- 通用服务器开发知识,需要关注如下几个点
- 高稳定性
- 高性能
- 高并发
- 高可用
- 流媒体服务器开发
- SFU vs MCU
- 流媒体协议转换
- 弱网下的音视频传输协议
- 录制 & 转码
- ......
- SFU vs MCU
- 通用服务器开发知识,需要关注如下几个点
上述内容中,客户端应用开发、音视频引擎SDK、音视频引擎框架、通用服务器开发等主要涉及C/C++通用开发知识,但要设计好这些部分必须对音视频相关的知识和产品业务有比较深刻的理解才能做到。
通常,音视频架构师比较关注这些部分。
而音视频引擎底层功能模块和SFU/MCU流媒体服务器的开发,则和音视频的专业知识密切相关。
- 音视频的采集模块
- 视频数据可以通过如下方式获得:
- USB摄像头
- 专业的硬件视频采集卡(有软压卡和硬压卡之分)
- 网络摄像机(支持RTSP协议)
- 操作系统提供的屏幕录制API
- 读取音视频文件并解码
- 订阅流媒体服务器上的流
- 音频数据可以通过如下方式获得:
- 声卡
- 扬声器播放声音的回环采集(依赖操作系统的API)
- 读取音视频文件并解码
- 订阅流媒体服务器上的流
- 支持音频输入的网络摄像机(支持RTSP协议)
- 支持音频输入的视频采集卡
- 在手机上,操作系统的SDK会提供相关的音视频采集接口
- 视频数据可以通过如下方式获得:
- 音/视频渲染
- 视频渲染一般需要了解OpenGL,而音频渲染需要了解OpenAL
- 可以通过开源库SDL来快速实现渲染模块
- 在Windows下使用DirectShow框架,操作系统提供了对应的视频和音频渲染模块(通过GraphEdit可以看到)
- 在DirectShow中渲染器会涉及到音视频同步的策略,当然,也完全可以自己去实现音视频同步模块
- 音/视频数据处理
- 这些模块基本是在编码前或解码后,对视频或音频的原始数据进行某种算法上的处理
- 视频处理主要包括分辨率转换、色彩空间转换、帧率转换、图像增强、多路视频拼接、添加字幕、添加LOGO图片等,这块对整体的性能影响比较大,往往需要使用SIMD指令进行汇编优化或使用GPU算法进行加速
- 音频处理主要包括回声消除、噪声抑制、自动增益、混音等,这块往往会涉及比较多的信号处理和数学知识,是音频中比较复杂的一块
- 音/视频编/解码
- 视频编/解码
- 要理解视频的基本编码原理,熟悉视频编码的关键参数和码流格式
- 目前使用比较多的是H.264,H.265开始逐步在使用,其他的视频编码也有很多,如AVS、VP8、VP9等
- 视频编码对音视频引擎的性能影响比较大,这块基本都是需要使用GPU加速的,目前的Intel集显对H.264和H.265支持还是比较好的,NVIDIA的独立显卡在编码上存在路数的限制;手机上一般都有对应的硬件加速模块;在性能较好的硬件上,可以考虑开源的X264
- 音频编/解码
- 要理解音频的基本编码原理,熟悉音频的关键参数和码流格式
- 目前使用比较多的是AAC,其他的音频编码也有很多,如G7.11、G.722、OPUS等
- 在PC上,一般音频的相关模块对性能的影响不明显,但在海思嵌入式系统上,音频模块对性能的影响就不能忽略,因为海思基本没有提供音频的硬件加速模块,而ARM CPU性能也有点弱
- 视频编/解码
- 录制
- 需要理解FLV、MP4、TS等容器格式
- 对于特殊的录制方式要注意软件的处理方式,例如,加片头和片尾的录制功能,追加录制
- MP4录制要注意moov box放在文件开始或结束对录制文件的写入和点播的影响
- 录制时音视频均匀混合的策略
- 串流
- 理解视频互动、直播和点播的工作原理
- 关键评价指标
- 延迟
- 首屏时间
- 同步
- 流畅性
- 画质/音质
- 理解下述的几种音视频传输协议
- RTMP
- HTTP + FLV / Websocket + FLV
- HLS
- RTP & RTCP
- RTSP
- SIP
- WebRTC
- H.323
- 弱网下的音视频传输协议
- 理解TCP协议栈原理
- 可靠的UDP传输协议
- KCP
- SRT
- QUIC
- FEC + 丢包重传机制(如NACK)
音视频的开发并不是完全从零开始,而是有许多可以依赖的开源库,但要用好这些库,需要对上述的音视频专业知识有深刻的理解。
文章最后有免费音视频学习资料包以及学习路线图可以领取
比较常见的音视频开源库,如下:
- ffmpeg
- 可以直接使用ffmpeg的命令行实现转码、切片等常见功能
- 可以基于FFmpeg API封装开发自己的音视频模块
- live555
- 比较完善的RTSP库
- x264
- 比较常用的H.264编码库
- fdkaac
- 比较常用的AAC编解码库
- librtmp
- 支持rtmp协议,产品化时需要自己进一步完善
- pjsip
- 支持sip协议
- webrtc
- google开源的webrtc库,有比较好的音/视频引擎,对网络状态的实时评估可以借鉴,回声消除模块也是比较有名的
- SDL
- 比较有名的音视频渲染库
- SRS
- 国内比较知名的RTMP流媒体服务器,支持HLS、HTTP+FLV,4.0版本开始支持WebRTC
- OWT
- Intel开源的WebRTC套件,支持了WebRTC客户端SDK和分布式的WebRTC MCU服务器
- OpenCV
- 著名的视频算法库
....
C/C++音视频开发技术要点与学习路线相关推荐
- java音视频开发技术_FFmpeg音视频核心技术精讲与实战
百度网盘2 D2 h2 i; n# o0 D# M* C! [: B1 M 第1章 学习指南[课程提供200+问题与答案库]4 a# t% { h6 ^: E# O [你遇到的坑,别人已经出坑了,课 ...
- 【音视频开发技术概要】技术背景、学习路线、业界大拿、岗位行业分析
音视频的知识纷繁复杂,自学非常困难,既需要非常扎实的基础知识,又需要有很多的工程经验:本文就从音视频开发,开源框架,视频,业界大神,书籍推荐,就业方向分析,为广大开发者学习音视频技术提供便利. 首先我 ...
- 音视频开发技术的进阶路线
1. 音视频开发包括哪些内容 虽然一篇文章无法把音视频开发的知识点都介绍清楚,但是大概的学习路线还是可以梳理一下的,我们先看看下面这张图: 其实说白了,音视频开发,就是要掌握图像.音频.视频的基础知识 ...
- 一文搞懂音视频开发技术点及职业发展方向
音视频的知识纷繁复杂,自学非常困难,既需要非常扎实的基础知识,又需要有很多的工程经验:本文就从音视频开发,开源框架,视频,业界大神,书籍推荐,就业方向分析,为广大开发者学习音视频技术提供便利. 首先我 ...
- 一名合格的音视频开发人员,需要掌握哪些技能呢?音视频技术该怎么学?
在线教育.音视频会议.即时通讯等产品都是基于音视频技术开发,如今越来越多的App中都大量加入了音频.视频元素,比如说注册与登陆的扫脸验证,dou音.wei视的音视频变速.变调录制.实时滤镜.人脸识别特 ...
- Android音视频开发从入门到精通,我这一路走来的经验分享
前不久,在国家统计局针对北京市进行的农民工市民化状况进行的调研中,从事信息技术,软件技术等IT服务业的人员也被当做农民工. 编程的门槛不高,薪资水平也还可观.这一直是"三百六十行,行行转IT ...
- 欢迎大家关注公众号【音视频开发训练营】
创建了一个微信公众号 音视频开发训练营,主要分享音视频,编解码,流媒体,直播等开发技术, 同时也关注 SRS, ffmpeg, x264,x265, VLC, webrtc等开源项目,也会关注移动端 ...
- 安卓音视频入门难,老司机分享音视频开发学习技巧与痛点
最近在写文章的时候,发现很多读者给我私信提问,想了解安卓音视频这块, 很多同学也对音视频开发有点浓厚的兴趣,但奈何没有系统的学习知识,仅靠自己苦苦钻研确实力不从心,今天就借这个机会分享一下我学习音视频 ...
- 音视频开发成长之路与音视频知识点总结
音视频涉及语音信号处理.数字图像处理.信息论.封装格式.编解码.流媒体协议.网络传输.渲染.算法等.在现实生活中,音视频发挥着越来越重要的作用,如视频会议.直播.短视频.播放器.语音聊天等.所以从事音 ...
最新文章
- SQL优化(二) 快速计算Distinct Count
- 如何将Java工程导出成可以执行的jar
- centos java tar_CentOS安装JDK-tar.gz文件
- jpeg 转rgb c 语言_威刚推出SE770G移动固态硬盘 主打高速传输和RGB灯效
- cocos2d-x 之 简单数据存储——Userdefault
- 机器学习| 面试题:11、LDA算法原理
- 联想小新打印机M7268W配置步骤
- 计算机网络课程设计——校园网的规划与设计
- 超图s3m服务加载时添加token
- 百度地图根据位置获取对应的位置中文
- 做带团长的社区团购吗?必死那种。
- 礼物帮手项目(3) - 传id跳转详情页(尝试2种方法)
- centos7校正系统时间
- 基于Vue+Node+SSM+MySQL的流浪动物救助平台设计与实现
- MySQL主从复制与读写分离配置及实操
- 关于新光源中我想做的事
- 解决springmvc中添加了静态资源访问路径之后就访问不到Controller路径的问题
- 企业级数据中台应用架构和技术架构
- python学习------面向对象的程序设计
- python扩展库xlwt支持对excel_Python扩展库xlwt支持对Excel2003或更低版本的Excel文件进行写操作。...
热门文章
- 轻量服务器架设网站打开速度慢,如何加速?
- pyqt创建窗口没有句柄_Word中如何创建自定义样式与应用样式
- MATLAB8.6安装慢,matlab 安装及安装完成初始化缓慢问题解决
- HANA tenant backup
- uniapp 本地打包app停留在启动页解决
- 如何使用录音转文字助手?免费教程来袭!两分钟学会!
- div css纵向显示 html,css如何设置竖排文字?
- 【题解】洛谷P4168 [Violet]蒲公英 (分块)
- 叩丁狼—Java培训实战教程之mysql优化
- 20张程序员才懂的搞笑图!保准你笑出猪叫......