浅谈音视频开发
音视频开发应用方向
1.流媒体网络通讯开发
? 流媒体网络通讯开发岗位 占70%~ 80%,就业,集中在芯片,安防,数字电视,广告,行车记录仪,车载系统,智能家居,楼宇对讲,视频会议....大部分从业者吃饭靠这个领域。需要掌握的是unix操作系统,网络socket通讯, 音视频基础,264/265基础,编解码,FFmpeg,常见的网络通讯协议TCP/UDP/RTMP/RTSP/RTP/HLS,当然还有WebRTC. 为什么大部分就业岗位都在这个领域,因为这个领域百花齐放,大量的硬件公司,各行各业,光一个跟摄像头相关的安防产业年产值就是几万亿,只要有摄像头的地方,就需要软件开发者,而且薪水还不错,入门者大部分年薪30W+。年薪50W,百万级的程序员也有,主要研究音视频流媒体领域的应用。
2.数字图像处理
? 音视频图像处理岗位,占大约20%+。主要集中在视频剪辑,特效,医疗,教育领域. 最近几年新兴的VR/AR领域。需要掌握的主要是音视频开发基础,FFmpeg, 重点是OpenGL/ES,会大量使用OpenGL/ES去写一些轻量级的渲染引擎。你可以把它看作一个精简版的游戏渲染引擎。这个领域有些特殊,容易跟互联网结合,一些软件容易形成垄断,比如视频剪辑领域,就那么三四个玩家。垄断了80%以上的份额。Finalcut pro , premire, Davinci.. 形成垄断的行业,绝大多数利润会向头部集中,也就不需要那么多就业,细分领域不多。
? 当然,这个领域也有自己的一些优势,比如比流媒体容易学习一些。未来十年前景也非常好。
3.AI
其实AI本来应该发展很迅猛的,但受限于MYZ,疫情,芯片严重缺货。终端,边缘计算领域,这几年还没发展起来。这个领域需要部分音视频基础 opencv,tensorflow,机器学习,深度学习...
视频文件/封装格式 ? 我们播放的视频文件一般都是用一种封装格式封装起来的,封装格式的作用是什么呢?一般视频文件里不光有视频,还有音频,封装格式的作用就是把视频和音频打包起来。 所以我们先要解封装格式,看有哪些视频流和哪些音频流,此时的音频流和视频流都还是压缩数据,不能直接用于显示的,这就需要解码。下面是播放一个视频文件时的流程图。
文章图片
一、视频文件封装格式 封装格式(也叫容器),就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中,也就是说仅仅是一个外壳,或者大家把它当成一个放视频轨和音频轨的文件夹也可以。说得通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个碗,或者一个锅,用来盛放饭菜的容器。 下面是几种常用的 视频文件后缀类型 与其相对应的 封装格式。
视频文件格式 | 视频封装格式 |
---|---|
.avi | AVI(Audio Video Interleaved) |
.wmv、.asf | WMV(Windows Media Video) |
.mpg、.mpeg、.vob、.dat、.3gp、.mp4 | MPEG(Moving Picture Experts Group) |
.mkv | Matroska |
.rm、.rmvb | Real Video |
.mov | QuickTime File Format |
.flv | Flash Video |
- 视频编码的作用: 将视频像素数据(RGB,YUV 等)压缩成视频码流,从而降低视频的数据量。
名称 | 推出机构 | 推出时间 | 目前使用领域 |
---|---|---|---|
HEVC(H.265) | MPEG/ITU-T | 2013 | 研发中 |
H.264 | MPEG/ITU-T | 2003 | 各个领域 |
MPEG4 | MPEG | 2001 | 不温不火 |
MPEG2 | MPEG | 1994 | 数字电视 |
VP9 | 2013 | 研发中 | |
VP8 | 2008 | 不普及 | |
VC-1 | Microsoft Inc. | 2006 | 微软平台 |
名称 | 推出机构 | 推出时间 | 目前使用领域 |
---|---|---|---|
AAC | MPEG | 1997 | 各个领域(新) |
MP3 | MPEG | 1993 | 各个领域(旧) |
WMV | Microsoft Inc. | 1999 | 微软平台 |
AC-3 | Dolby Inc. | 1992 | 电影 |
2 AAC AAC,英文全称 Advanced Audio Coding,是由 Fraunhofer IIS、杜比实验室、AT&T、Sony 等公司共同开发,在 1997 年推出的基于 MPEG-2 的音频编码技术。2000 年,MPEG-4 标准出现后,AAC 重新集成了其特性,加入了 SBR 技术和 PS 技术,为了区别于传统的 MPEG-2 AAC 又称为 MPEG-4 AAC。 AAC 比 MP3 有更高的压缩比,同样大小的音频文件,AAC 的音质更高。
3 WMA WMA,英文全称 Windows Media Audio,由微软公司开发的一种数字音频压缩格式,本身包括有损和无损压缩格式。
视频编码 【浅谈音视频开发】? 视频是连续的图像序列,由连续的帧构成,一帧即为一幅图像。由于人眼的视觉暂留效应,当帧序列以一定的速率 播放时,我们看到的就是动作连续的视频。 这么多连续的图像数据如果不经过编码的数据量太大了。比如一个 1920x1080分辨率,24位,每秒30帧的视频,一秒钟需要 1920*1080*24*30=1492992000 位数据,大约为: 1.5Gbps(bps: 位/秒 )。
文章图片
? 左图是一个时长为2小时,经过编码封装后的的mp4文件;右图则是从mp4中抽取出来的一分钟的解码后的视频数 据。可以看到2小时的音频+视频文件大小为516M,而单独的未压缩编码的1分钟的yuv图像数据为1.73G。
? 因此我们可以先简单的理解编码最主要的目的就是压缩数据。所谓视频编码就是指通过压缩技术,将原始视频格式 的文件转换成另一种视频格式文件。
? 原始视频压缩的目的是去除冗余信息。大量统计表明,同一副图像的临近像素之间有着相关性,相邻图像之间内容 也存在相似,也就是说有大量的冗余信息。编码就是为了压缩 ,要实现压缩,就要设计各种算法,将视频数据中的 冗余信息去除,包括空间上的冗余和时间上的冗余。
1.如何编码?
? 编码的目的,就是为了压缩数据。各种视频编码方式,都是为了让视频变得体积更小,有利于存储和传输。编码的核心思想就是去除冗余信息。
? 空间冗余:图像内部相邻像素之间存在较强的相关性多造成的冗余。
? 时间冗余:视频图像序列中的不同帧之间的相关性所造成的冗余。
? 视觉冗余:是指人眼不能感知或不敏感的那部分图像信息。
? 信息熵冗余:也称编码冗余,人们用于表达某一信息所需要的比特数总比理论上表示该信息所需要的最少比特数要大,它们之间的差距就是信息熵冗余,或称编码冗余。
? 知识冗余:是指在有些图像中还包含与某些验证知识有关的信息。
文章图片
2.IPB帧
? I 帧:帧内编码帧,帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)。
? P帧:前向预测编码帧。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)。
? B帧:双向预测内插编码帧。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况,但我这样说简单些),换言之,要解码B帧。不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累。
文章图片
H.264编码标准
? H.264与H.265是目前视频格式中用得最广泛的编码方式,H.264创造了多参考帧、多块类型、整数变换、帧内预测 等新的压缩技术,使用更精细的分像素运动矢量和新一代的环路滤波器,使得压缩性更高,系统更加完善。H.265 则是ITU-T继H.264之后制定的新标准,旨在在有限的带宽下传输更高质量的网络视频。
划分宏块
H264视频压缩算法现在无疑是所有视频压缩技术中使用最广泛,最流行的。随着 x264/openh264以ffmpeg等开源库的推出,大多数使用者无需再对H264的细节做过多的研究,这大降低了人们使用H264的成本H264的基本原理其实非常简单,下我们就简单的描述一下H264压缩数据的过程。通过摄像头采集到的视频被送到 H264 编码器的缓冲区中。编码器先要为每一幅图片划分宏块。
文章图片
一帧图片经过 H.264 编码器之后,就被编码为一个或多个片(slice), 每片包含整数个宏块(至少一个宏块,最多 包含整个图像宏块),而装载着这些片(slice)的载体,就是 NAL单元 。
3.H.264码流分析
H.264码流文件分为两层。
? 1.VCL(Video Coding Layer,视频编码层):负责高效的视频内容表示,VCL数据即编码处理的输出,它表示 被压缩编码后的视频数据序列。VCL只关心编码部分,重点在于编码算法以及在特定硬件平台的实现,VCL输 出的是编码后纯视频流信息,没有任何冗余头信息。
? 2.NAL(Network Abstraction Layer,网络提取层):负责以网络所要求的恰当的方式对数据进行打包和传 送,是传输层。不管在本地播放还是网络播放,都要通过这一层来传输。NAL关心的是VCL输出纯视频流如何 被表达和封包利于网络传输。
VCL就是编码后的原始数据,在VCL数据封装到NAL单元中之后,才可以用于传输或存储。
音频 ? 同视频编码一样,音频编码的目的也是压缩数据。常见的音频编码格式有:AAC、MP3、AC3等
数字音频 ? 模拟音频的记录就是通过唱片表面的起伏跌宕或者是磁带上的磁粉引起的磁场强度来表示音箱上振膜的即时位置, 比如说,当唱片表面在某一时刻比前一时刻的纹路呈下降趋势时,音箱上的振膜就会向里收缩;如果呈上升趋势, 音箱上的振膜就会向外舒张。
? 模拟音频是连续信号,连续信号的特点是连续,比如唱片、磁带,磁带在播放时磁带的移动是连续水平移动的,唱 机的唱针在唱片上运动时是连续变化的。这意味着信号不会失真,但是保存这样的介质就会非常困难,比如说唱片 会磨损,磁带也会老化。
? 不过可以使用数字来记录下这些信息。这些模拟信息一旦被数字保存就可以被永久的保存不会磨损,也可以轻松的 被传输,这就是数字音频。
? 为了将模拟信号数字化,首先需要对模拟信号采样,所谓采样就是在时间轴上对信号进行数字化。按照奈奎斯特定 理(采样定理),按比声音最高频率高2倍以上的频率对声音进行采样。对于高质量的音频信号,频率范围为(人 耳能听到得范围):20Hz ~ 20kHz,所以当前声卡常用的采样频率一般为44.1KHz(1秒采样44100次)。
文章图片
每个采样通过量化记录数据。量化就是指在幅度轴上对信号进行数字化,比如16bit的二进制信号表示一个声音采 样。然后按照一定的格式记录采样和量化后的数字数据。
? 通常所说的音频的裸数据就是脉冲编码调制(PCM)。描述一段PCM数据一般需要:量化格式 (sampleFormat)、采样率(sampleRate)、声道数(channel)。以CD的音质为例,量化格式(也描述为位 深度)为:16bit,采样率为:44100,声道数为2。对于声音数据码率计算为:
? 44100 16 2 = 1378.125kbps
? 如果是1分钟的这类CD音质的数据占用存储空间为:
? 1378.125 * 60 / 8 / 1024 = 10.09MB
? 10M的大小如果仅仅存在磁盘中,可能还好,但是要在网络中实时传输,那么这个数据量就太大了。所以必须对其 进行压缩编码。对于声音数据而言,不被人耳感知到的信号,包括人耳听觉范围之外的以及掩蔽掉的信号就是冗余 信号。编码实际上就是把这些冗余信号压缩、去除掉。
音视频直播 ? 直播架构主要分三块。第一块采集数据推流过程,包括对数据流编码,通过流媒体协议传输到服务器上。第二块是 服务端收到推流数据后,进行内容分发以及中间转存处理。最后一块是播放器进行拉流操作。这其中不只是播放音 视频,还可以做一些实时美颜和滤镜效果。由这三部分共同组成整个直播系统的主播端和用户端之间在视频内容上 的交互。整个流程式直播使用推流系统将采集的音视频进行编码,并最终发送到流媒体服务器上;用户端使用拉流 系统将流媒体服务器上的视频资源进行播放。整个过程是一个发布者/订阅这的模式。
RTMP ? RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。该协议基于TCP,是一个协议族, 包括RTMP基本协议及RTMPT、RTMPS、RTMPE等多个变种协议。RTMP是一种被设计用来进行实时数据通信的网 络协议,主要用在Flash平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。支持该协议的软 件包括Adobe Media Server、Ultrant Media Server、Red5等。 RTMP是目前主流的流媒体传输协议,广泛应用 于直播领域,可以说市面上绝大多数的直播产品都采用了这个协议。
推流 ? 推流过程就是把编码后的数据打包并通过直播协议发送给流媒体服务器的过程:
文章图片
? RTMP与HTTP(超文本传输协议)同样是一个基于TCP的Real Time Messaging Protocol(实时消息传输协议)。由 Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的一种开放协议 。在国内被广泛的应 用于直播领域。HTTP默认端口为80,RTMP则为1935。 我们通过阅读Adobe的协议规范,通过与服务器建立TCP通信(Socket),根据协议格式生成与解析数据即可使用 RTMP进行直播。当然我们也可以借助一些实现了RTMP协议的开源库来完成这一过程。
推荐阅读
- 深入理解Go之generate
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 我的软件测试开发工程师书单
- echart|echart 双轴图开发
- NPDP拆书(三)(新产品开发战略(经营与创新战略))
- 芯灵思SinlinxA33开发板Linux内核定时器编程
- 性能测试中QPS和TPS的区别
- 常用git命令总结
- 藏族开发的修路人——记致富援乡的斯定那珠
- ASP.NET|ASP.NET Core应用开发思维导图