风口之上,精通音视频开发能有多香?

Posted River_ly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了风口之上,精通音视频开发能有多香?相关的知识,希望对你有一定的参考价值。

音视频开发之前算是一个相对冷门的方向,近年来稍微好一点了,市场环境打开了,想往这个方向转的人也就比较多了,去年国家整顿了教培行业,影响了在线教育这个音视频领域比较重要的一个应用场景,有些同学又开始犯难了,觉得风向不对

其实我觉得大可不必,因为驱动音视频技术发展的两个重大动力并没有发生变化:

  1. 互动娱乐
  2. 信息交流

音视频技术会提升大家在游戏中体验——具体看AR和VR的应用(虽然从2015年之后每一年都被称为AR元年,但是游戏的AR化正在慢慢成为现实,至于什么时候成为主流,那要看硬件的发展)。

同时我们生活中常见的视频聊天、视频会议、视频直播购物等等也极大地方便和影响着我们的生活。

音视频的岗位逐渐增多,其优于同等岗位的薪资待遇也吸引着更多的人加入,但是有很多人反馈音视频不好入门,学习的东西比较多,门槛比较高,初学者往往抓不住重点,导致事倍功半。最近我面试了一些同学,他们主要的背景有如下几类:

  1. 熟悉FFmpeg,但仅限于命令
  2. 熟悉android,但是对Camera/MediaCodec/OpenGL一知半解,对JNI开发不熟悉
  3. 熟悉Java,不熟悉C++
  4. 擅长业务开发,不擅长分析问题

有些想转音视频的同学或多或少存在上面的问题,你可能知道音视频开发需要掌握哪些技能,但是掌握到何种程度?不知道掌握到能完成什么样的工作的程度?从涉及的领域来分,音视频相关的岗位可以分为:

  1. 音视频生产——VideoEditor
  2. 音视频消费——播放器
  3. 3D渲染——Filament或者其他的渲染引擎
  4. 音视频传输——WebRTC/RTMP/QUIC/UDP
  5. 算法——OpenCV/模型分割/编解码算法优化

它们虽然是音视频的不同领域,但是它们之间的差异也是非常大的,可以算是完全不同的方向了。所以在你确定好音视频这个大方向之后,最好能坚定地确定下来往什么方向走?但是人就是这样,在一个坑里刨,如果长时间刨不到水,就会放弃,然后再刨另外一个坑,最后刨地到处是坑,却没有多少有水的坑。

学习我比较支持在一个方向挖得比较深入,就是基本上这个方向上的问题你都能解决或者解决起来不费劲,然后可以以此拓展,向其他方向延伸。不要在职业生涯的早期过分重视广度而忽略深度。

我之前的文章——《精通音视频开发是真的可以为所欲为》介绍了音视频相关的知识。我这里想借着Video Editor来谈谈其中用到了哪些音视频技术以及需要的具体技能。

VideoEditor就是音视频编辑器,字节有剪映,快手有快剪,微信有秒剪,主流的视频平台都会有自己的音视频编辑器,做一个音视频编辑器可不是一件容易的事情,需要一个不小的团队,如果涉及到多个平台,需要的人更多,各大厂费钱去养活这么大的团队,是希望一个好的Video Editor能够生产出用户希望的视频,然后扩充自家的视频内容,进而提升视频平台的活跃度,这是一个产品的闭环思维:

一个视频内容平台让用户喜爱的原因只能是:用户喜欢它的内容或者说内容。当然像腾讯视频、优酷、爱奇艺这种PCG的平台它们无须按照上面的逻辑,因为它们作为平台本身就是上传视频的”用户“,内容的精良则必须要自己花钱买,它们的商业逻辑又是另外一回事情了。

为了吸引用户,主流的VideoEditor推出了很多视频模板,视频模板大大降低了普通用户生产视频的难度,用户只需要上传几段视频或者图片,就能生产出一个非常优美的视频,这对视频UGC而且是一个很大的突破,真正将一个小众的视频剪辑推广到了大众化的水平。

VideoEditor中很多其他的功能基本上都能由上面的子功能组合而成,例如一个视频模板,就是解析多个特效组成的,或者解析一个特效视频,本质上就是原视频+特效视频=合成视频

简单地看来,VideoEditor确实没什么难的,但是要打磨出一款优秀的VideoEditor软件,并不是一件非常容易的事情,想通过几篇八股文来应付音视频的面试不是容易的事情。建议大家还是深入挖掘背后的技术原理。

这儿我给大家提几个问题:

上面的几个问题都是VideoEditor软件中遇到的比较棘手的问题,你如果自信能掌握得比较好,那恭喜你,你可以算得上一个不错的VideoEditor工程师了,当然接下来的挑战也是大大的。你对OpenGL熟悉吗?可以做出一些不错的图片效果吗?OpenGL在处理图片纹理的时候如何优化性能。

本文只是一个引子,大家可以一起讨论和交流,后面我会不定期地更新相关的文章来描述如何做一个高质量的VideoEditor。完成一件事情不难,但是做好一件事情不容易,且行且珍惜。

音视频开发的学习之路

音视频相关开发涉及面很广,如果想深入音视频领域发展,从我个人学习的经历来看,想要成为一名合格的开发者,除了基础的Android开发知识以外,下面的技术栈也是需要掌握的。

语言

  • C/C++:音视频开发经常需要跟底层代码打交道,掌握C/C++是必须的技能。这方面资料很多,相信我们都能找到。
  • ARM NEON汇编:这是一项进阶技能,在视频编解码、各种帧处理低下时很多都是利用NEON汇编加速,例如FFmpeg/libyuv底层都大量利用了NEON汇编来加速处理过程。虽说它不是必备技能,但有兴趣也可以多多了解,具体资料可以参考ARM社区的教程。

框架

  • FFmpeg:可以说是业界最出名的音视频处理框架了,几乎囊括音视频开发的所有流程,可以说是必备技能。
  • libyuv:Google开源的YUV帧处理库,因为摄像头输出、编解码输入输出也是基于YUV格式,所以也经常需要这个库来操作数据(FFmpeg也有提供了这个库里面所有的功能,在libswscale都可以找到类似的实现。不过这个库性能更好,也是基于NEON汇编加速)。
  • libx264/libx265:目前业界最为广泛使用的H.264/H.265软编解码库。移动平台上虽然可以使用硬编码,但很多时候出于兼容性或画质的考虑,因为不少低端的Android机器,在低码率的场景下还是软编码的画质会更好,最终可能还是得考虑使用软编解码。
  • OpenGL ES:当今,大部分视频特效、美颜算法的处理,最终渲染都是基于GLES来实现的,因此想要深入音视频的开发,GLES是必备的知识。另外,除了GLES以外,Vulkan也是近几年开始发展起来的一个更高性能的图形API,但目前来看,使用还不是特别广泛。
  • ExoPlayer/ijkplayer:一个完整的视频类App肯定会涉及视频播放的体验,这两个库可以说是当下业界最为常用的视频播放器了,支持众多格式、协议,如果你想要深入学习视频播放处理,它们几乎也算是必备技能。

从实际需求出发,基于上述技术栈,我们可以从下面两条路径来深入学习。

1. 视频相关特效开发

直播、小视频相关App目前越来越多,几乎每个App相关的特效,往往都是利用OpenGL本身来实现。对于一些简单的特效,可以使用类似Color Look Up Table的技术,通过修改素材配合Shader来查找颜色替换就能实现。如果要继续学习更加复杂的滤镜,推荐你可以去shadertoy学习参考,上面有非常多Shader的例子。

而美颜、美型相关的效果,特别是美型,需要利用人脸识别获取到关键点,对人脸纹理进行三角划分,然后再通过Shader中放大、偏移对应关键点纹理坐标来实现。如果想要深入视频特效类的开发,我推荐可以多学习OpenGL相关的知识,这里会涉及很多优化点。

2. 视频编码压缩算法

H.264/H.265都是非常成熟的视频编码标准,如何利用这些视频编码标准,在保证视频质量的前提下,将视频大小最小化,从而节省带宽,这就需要对视频编码标准本身要有非常深刻的理解,是一个门槛相对较高的方向。

相关学习资源:

Android 音视频开发这块目前没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的。只能通过一点点的学习和积累把这块的知识串联积累起来。

不少人在音视频初级入门过程中只是接触Android多媒体展示相关的API,通过单独的列举和使用这些API,只能让你对Android音视频处理有一个基本的轮廓,知识点都是零散的,根本没有有效的途径将所有知识点串联起来。

这样对于音视频的了解和控制就仅仅局限于最外层的API了,在深入学习之前,往往这些API就已经把脑袋都弄大了,而且,仅仅停留在使用API的层次,不能让你适应不断变化的需求。

如果最开始的方向都错了,那么不管你如何努力,都学不好音视频!

而如果是跟着正确的学习路线一步步深挖,那么一切都不是问题!

这里给大家推荐《音视频开发核心知识点笔记》,有需要的朋友们可以直接前往公号中:Android开发之家自行访问查阅。

音视频初级入门

  • Android 音视频开发(一):通过三种方式绘制图片
  • Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件
  • Android 音视频开发(三):使用 AudioTrack 播放PCM音频
  • Android 音视频开发(四):使用 Camera API 采集视频数据
  • Android 音视频开发(五):使用 MediaExtractor 和 MediaMuxer API 解析和封装 mp4 文件
  • Android 音视频开发(六):MediaCodec API 详解
  • Android 音视频开发(七):音视频录制流程总结
  • ……

音视频中级进阶:OpenSL ES 学习

  • Android OpenGL ES 开发(一): OpenGL ES 介绍
  • Android OpenGL ES 开发(二): OpenGL ES 环境搭建
  • Android OpenGL ES 开发(三): OpenGL ES 定义形状
  • Android OpenGL ES 开发(四): OpenGL ES 绘制形状
  • Android OpenGL ES 开发(五): OpenGL ES 使用投影和相机视图
  • Android OpenGL ES 开发(六): OpenGL ES 添加运动效果
  • Android OpenGL ES 开发(七): OpenGL ES 响应触摸事件
  • Android OpenGL ES 开发(八): OpenGL ES 着色器语言GLSL
  • Android OpenGL ES 开发(九): OpenGL ES 纹理贴图
  • Android OpenGL ES 开发(十): 通过GLES20与着色器交互
  • ……

如果需要这份《音视频开发核心知识点笔记》,可以前往公号中:Android开发之家自行访问查阅。

音视频高级探究

音视频编解码技术

  • 音视频编解码技术(一):MPEG-4/H.264 AVC 编解码标准
  • 音视频编解码技术(二):AAC 音频编码技术
  • ……

流媒体协议

  • 流媒体协议(一):HLS 协议
  • 流媒体协议(二):RTMP协议
  • ……

多媒体文件格式

  • 多媒体文件格式(一):MP4 格式
  • 多媒体文件格式(二):FLV 格式
  • 多媒体文件格式(三):M3U8 格式
  • 多媒体文件格式(四):TS 格式
  • 多媒体文件格式(五):PCM / WAV 格式
  • ……

FFmpeg 学习

  • FFmpeg命令行工具学习(一):查看媒体文件头信息工具ffprobe
  • FFmpeg命令行工具学习(二):播放媒体文件的工具ffplay
  • FFmpeg命令行工具学习(三):媒体文件转换工具ffmpeg
  • FFmpeg命令行工具学习(四):FFmpeg 采集设备
  • FFmpeg命令行工具学习(五):FFmpeg 调整音视频播放速度
  • ……

  • FFmpeg 学习(一):FFmpeg 简介
  • FFmpeg 学习(二):Mac下安装FFmpeg
  • FFmpeg 学习(三):将 FFmpeg 移植到 Android平台
  • FFmpeg 学习(四):FFmpeg API 介绍与通用 API 分析
  • FFmpeg 学习(五):FFmpeg 编解码 API 分析
  • FFmpeg 学习(六):FFmpeg 核心模块 libavformat 与 libavcodec 分析
  • ……

  • FFmpeg 结构体学习(一):AVFormatContext 分析
  • FFmpeg 结构体学习(二):AVStream 分析
  • FFmpeg 结构体学习(三):AVPacket 分析
  • FFmpeg 结构体学习(四):AVFrame 分析
  • FFmpeg 结构体学习(五):AVCodec 分析
  • FFmpeg 结构体学习(六):AVCodecContext 分析
  • FFmpeg 结构体学习(七):AVIOContext 分析
  • FFmpeg 结构体学习(八):FFMPEG中重要结构体之间的关系
  • ……

  • FFmpeg 开发之 AVFilter 使用流程总结
  • FFmpeg 过时 Api 汇总整理
  • ……

如果需要这份《音视频开发核心知识点笔记》,可以前往公号中:Android开发之家自行访问查阅。

创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖

以上是关于风口之上,精通音视频开发能有多香?的主要内容,如果未能解决你的问题,请参考以下文章

抱紧风口技术潮流!开启Android开发的新篇章!

音视频,时代的风口浪尖,Android 开发者的新机遇

顶级技术大咖,揭秘实时音视频开发的超级风口

顶级技术大咖,揭秘实时音视频开发的超级风口

实时音视频的超级风口,开发者的机会在哪里?

作为一名iOS开发者—面对音视频这个新风口应该怎样学习才能乘风而起?