音视频技术一句话简单来说就是通过网络将图像和声音从生产端分发给消费端的技术。可以是以点播的方式,也可以是直播的方式,也可以是像视频会议一样互动的方式。现在的网络流量一多半都是在传输音视频的数据,音视频相关的app几乎每个人都在使用,占据了大众娱乐的半壁江山。
**音视频生产端:**音视频的采集 ->预处理-> 编码 -> 封装 -> 网络发送
**音视频消费端:**网络接收 -> 解封装 -> 解码 -> 渲染
android平台上的音频采集一般就三种:1.利用android内置的应用程序 2.使用MediaRecorder进行音频捕获 3.使用AudioRecord进行音频捕获。此3种方式的灵活性逐渐增大,相应的所需要做的工作也逐渐增多。
视频数据的预处理一般包括视频图像的滤镜处理、美颜处理、加字幕,绿幕抠图。
音频的预处理一般包括声音的3A算法和变速变调处理,这个在 WebRTC里面有详细的介绍和实现。
视频的编码标准:
音频的编码标准:
以我目前的工作经验最常用的视频编码是 h264 音频编码是 AAC 编码。
音视频编码后需要将音视频包以某种容器封装起来,这个步骤成为音视频的封装。常见的封装格式
ffmepg 支持非常丰富的媒体封装格式。查看 ffmepg 支持的封装格式命令如下
ffmpeg -muxers
常见的音视频的网络传输协议有 rtmp http-flv rtsp srt hls rtc udp ,各有优劣,这里不做详细对比。
感兴趣可以百度 google搜索了解。
解封装是上面介绍的封装的逆操作,从音视频的容器中将音频包、视频包分离出来放到各自的队列,等待各自的解码线程去解码渲染视频,播放音频。
编码的逆操作,将视频包解码成原始的视频帧,将音频包解码成原始的pcm音频数据。
视频的渲染 windows 平台下可以使用 Direct3D 技术渲染视频,macOS,Android 和 Linux 可以使用 OpenGL 、OpenGLES 技术渲染视频。
要学习音视频,无论是直播还是音视频处理,ffmpeg 和webrtc 基本是绕不过去的,相对webrtc 来说,ffmpeg 应用的更广 。
音视频的知识范围很广,要学的东西很深。文章篇幅有限,我把根据音视频的学习思路,整理出的一套系统性的学习笔记。我把这套学习笔记放在文章链接中,对音视频感兴趣的人,可以借鉴加深学习!
本人在学习音视频开发的过程中,深刻体会到了由于知识的分散、过渡断层带来的种种困惑和痛苦,因此希望通过自己的理解,可以把音视频开发相关的知识总结出来,并形成系列文章,循序渐进,剖析各个环节,一则对自己所学做一个总结和巩固,二则希望可以帮助想入门音视频开发的开发者小伙伴们。
冰冻三尺非一日之寒,滴水石穿非一日之功。
加油!让我们早日成为音视频开发者六边形战士!