如何学习音视频开发?

题主还在读研,最近想从后端开发转到音视频开发,但是不知应该如何入门,之前在做项目的时候接触了一些ffmpeg的知识,但也就止步于此了。。。发现知乎上目…
关注者
815
被浏览
510,676

79 个回答

首先,需要你丰富的c/c++开发经验。 有的人,c/c++基础语法都没搞懂,每天瞎几把问这个代码什么意思,为什么指针会这么用,这里为什么这么些?呵呵呵, 我奉劝真的想搞音视频的,先去学好c/c++。至少有个10w行代码c/c++经验。

其次,音视频的概念很好入门,音频编码,视频编码ibp关键帧,音频文件封装格式,视频文件封装格式,流媒体协议。然后就是时间戳,音视频同步。

其实没什么多余的知识。 入门很简单。

我列举个学习步骤:

第一步:学习掌握音视频编码基础知识, 关键词,ffmpeg。

用c调用ffmpeg尝试视频编码和解码,掌握基础的流程。成果:能开发一个极简的视频播放器,和一个极简的录音麦克风pcm为mp3。

第二部:深入了解音视频开发 和学习流媒体。

尝试开发一个简单的 远程实时桌面

采集桌面图像-> 编码低延迟h264 ->发送到远端 ->远端接收解码h264显示

接收重现键鼠消息 <- 发送键鼠消息

我曾经6天写出了这个demo。 其实很多东西,这都不是音视频开发的独有,这是需要你的c/c++编程知识。 比如我写的这个demo,图像编码只是其中的一个模块,我甚至可以直接发rgb或者jpg图像去远端,不用h264,所以很多东西,就是你的c/c++编程经验,而不是音视频知识。

流媒体:

什么是流媒体? 在我看来,就是把音视频塞到网络传输里, 这和普通网络编程的区别就是,你传输的不是你原来的业务数据,只是变成了流媒体,还有你需要换协议, 仅此而已 。所以不要想什么流媒体很复杂。 当然,你如果没有c/c++编程经验或者很烂,没有网络编程经验,那么肯定难,因为你没学爬就学飞了。

流媒体练手最好还是自己用手撸一个rtmp服务器, 这个前提是,你得有c/c++服务器编程经验,你如果没有服务器编程经验,上来就说,流媒体开发太难了,那不是白扯。

rtmp协议很好解析,最难的就是开头那点rmtp块,rtmp块组成包,包再解析成命令或数据。我建议要自己撸rtmp服务器,多参考开源的, 国人写了不少rtmp服务器在github,自己去搜

第三部分webrtc和实时音视频rtc

这块才是音视频开发最深的 ,因为实时音视频用的是udp。而普通的流媒体都是tcp。

实时音视频要做到很好的产品,需要你各方面去优化,才能达到低延迟实时通讯,从丢包网络阻塞到选择码率到fec,从音频降噪到回音消除,从全球cdn,到客户端代码的极致优化。

so,webrtc是一个非常好非常优秀的项目,可以照抄里面的很多东西,这个抄是自己吸纳,而不是照搬, 如果你没有抄的能力是照搬的,那就挺遗憾的