首页 > 其他分享 >Android开发想转行音视频,应该要怎么做?

Android开发想转行音视频,应该要怎么做?

时间:2023-06-22 10:36:48浏览次数:35  
标签:视频 FFmpeg 转行 音视频 概念 源码 Android 技能


在星球经常被问到的问题,Android开发想转行音视频,应该要怎么做?

很多人对此都有疑惑,不光有工作多年的职场老司机,也有求学期间的研究生同学们,摘录了其中一部分提问,可以看到大家的疑惑是有类似的。

Android开发想转行音视频,应该要怎么做?_音视频

Android开发想转行音视频,应该要怎么做?_Android_02

Android开发想转行音视频,应该要怎么做?_封装_03

Android开发想转行音视频,应该要怎么做?_音视频开发_04

Android开发想转行音视频,应该要怎么做?_Android_05

对于星球用户的每个提问我都有认真回答,毕竟每个人的情况不一样,没有什么统一的答案。

这些提问其实可以归为两类:

  1. 针对自己的情况,现阶段要从事音视频开发吗?这是一个关于利弊分析的问题,也是特别实际,很现实的问题。
  2. 已经决定从事音视频开发,要怎么去做呢?这是一个学习路线的问题,也是我个人的经验可以给到帮助的问题。

其实,第一类问题要不要从事音视频开发 会比 第二类问题从事音视频开发要怎么做 更难回答一些,毕竟迈出第一步永远是最难的。

要不要从事音视频开发

尤其是针对已经工作多年的朋友来说,这是一个职业规划的问题,每个人的职业经历、思考角度甚至利益关系都不一样,在十字路口上选择的方向也是不同的。

不同于技术问题的回答,闻道有先后,术业有专攻,在我不熟悉的领域回答错了问题,并不是一件丢人的事情,反而是个学习的机会。

但职场上给错了建议,并且听从执行了,那在短暂的程序员生涯上可能会造成不可逆的影响,尤其是我本身还从事音视频的开发,在一些观念上就会有一些偏袒,很难做到客观中立。

所以针对第一类问题,我只能从行业趋势和自己的观察上给出一些看法。

这一两年因为该死的疫情,让短视频、超高清视频和实时音视频反而成为需求风口。

我的看法当然是觉得音视频这个行业还可以,而且从我自己的观察来看,做音视频的现在普遍年龄都在 30+ 了,我 94 年的在组里有可能还是年龄最小的那一批人了。

做客户端上的音视频、服务端上的、嵌入式的、系统底层的都是音视频的范围,另外从事音视频编解码算法、网络通信协议、视频超分、音频降噪等等,也是音视频的领域范围内,所以说音视频也可以是一个很大的范围体系,每个人处在其中的位置不同而已。

如果你很熟练 FFmpeg ,熟悉播放器,或者很懂 OpenGL 渲染,那么不懂 JVM ,不懂 Android Framework 一点也不妨碍你找高薪工作。

以上就是关于 第一类问题要不要从事音视频开发 的建议,每个人都不同,具体情况还是要具体分析的,仅供参考。

如果你决定迈出第一步,尝试一下入门或者转行音视频,那么可以接下往下看了。

从事音视频开发要怎么做

对于 第二类问题从事音视频开发要怎么做 大概会从四个方面给出路线:

  1. 概念
  2. 技能
  3. 架构
  4. 实践

概念

首先,最重要的就是概念了。

既然认为音视频也是一个单独的领域,那么每个领域就会有它对应的名词概念。学音视频也和我们上学学习一样,一门学科一开始肯定要学一些新的名词概念。

关于音视频常见的概念有哪些呢?帧率、码率、I 帧、B 帧、P 帧吗?

那么问题来了,这些概念你是从哪里得知的?尤其是 I 帧、B 帧、P 帧这种常见的面试八股文会提到的

想必很多人我和一样,都是从网络上一些博客中得知的。但网络博客质量参差不齐,且不说一篇文章会被反复抄袭无数遍,就文章中内容可能都不是对的,而有的同学却没有经过的自己思考,盲目的吸收这些概念,等到后期遇到疑难杂症要解决时,却发现连一些基础概念都没搞懂。

这也是目前学习音视频中比较蛋疼的地方,缺少统一的教材能够把一些概念讲清楚,尤其是涉及深一点的概念,牵扯的内容很多,不是一两页就能讲清楚的。

后续如果遇到好的资料,也会在知识星球内分享给大家。

这里我举个例子,前端面试中会有个典型的题目:从输入 URL 到页面展示到底发生了什么?

换到音视频行业中,从相机录制到编码成视频会发生什么,牵扯到哪些概念?

就这么一个问题都会涉及到很多操作和概念了,而从移动端转向音视频开发的同学可能就缺少系统的了解,只有碎片化的学习。

就相机操作来说,常见的相机光圈、ISO 参数、测光模式、对焦模式、焦距、曝光补偿等概念。

就相机数据来说,YUV 格式,NV12、YUV420 等,另外还涉及到色域空间 BT.601、BT.709 等,再深入还能涉及相机的 Gamma 曲线,还有 HDR 视频的 HLG、PQ 曲线,Tone Mapping 概念等。

就视频编码来说,涉及到 H.264 算法,常见概念有 IDR 帧、I 帧、B 帧、P 帧等,另外还有开放 GOP 和闭合 GOP 、静态码率和动态码率、AVCC 和 Annex-b 码流格式等。

就音频编码来说,涉及到 ACC 算法,常见概念有采样率、采样位数、声道数、比特率等,深入一点的话,还有 ACC 的 ADTS 以及 ADIF 文件格式信息等。

最后封装成的 MP4 视频,涉及到封装格式,MP4 的各种 BOX 概念,常见的有 ftyp、moov、ctts 等,另外如何用工具去排查格式问题。

以上概念算是很常见了,面试八股文中会问到,死记硬背当然简单,但要实际去理解这些概念,在代码中调试他们,真真切切地感受这些概念的差异。

另外,这些涉及到图像、视频、音频等基础概念,不要觉得是 IT 人员搞音视频才会有的,还没有音视频技术之前人类就已经研究过很多年了。

就好比色域空间这个概念,在艺术领域同样要用到,设计师们也要了解 sRGB 色域、P3 色域等知识。再比如采样率这个概念,著名的奈奎斯特采样定理早在上个世纪20年代就提出了,而第一台计算机二十年后才诞生。理论先行,思想指导行动这个道理肯定没错的。

音视频也可以认为是一门杂学科目,确实各个方面都会涉及到,这也是为什么要强调概念很重要,基础不牢,地动山摇。

当然了,一开始也不可能掌握好所有的概念,但随着深入的学习就会愈发觉得把一些基础概念弄清楚有多重要。

2. 技能

掌握音视频概念之后,接下来就是技能了,也是很多人关心的音视频开发要如何学习的部分。

为什么要把这部分称作技能呢?在网上其实也有很多音视频入门指南了,有的指南还很全面,每篇文章都会讲解技术点,讲述 API 具体如何使用等。

举个例子:

  1. 使用 MediaExtractor 和 MediaMuxer 来解封装和封装 mp4 文件
  2. 使用 MediaCodec 来编码和解码 H.264 和 AAC 数据
  3. 使用 Camera API 完成相机的预览、对焦操作
  4. 使用 FFmpeg 做视频的解封装和封装
  5. 使用 FFmpeg、libx264、libfdk-aac 等各种库完成音视频的编解码操作等

以前的我也认为把上面内容都掌握了,就算是学懂音视频了,现在才觉得他们就是一些技能而已,是学习音视频的必要不充分条件。

音视频相关的技能操作肯定是必须要掌握的,但如果只沉醉于各种技能的学习,那么我可以很认真地告诉你,你只会是一个工具人而已

不要为了学习技能而学习技能,举个例子,安卓上想要实现音频的播放有哪些方式呢?

系统提供的 API 就有 MediaPlayer 、AudioTrack 直接播放音频,底层一点还可以用 OpenSL 播放音频。

另外还可以使用第三方库 FFmpeg、libfdk-aac 等来做解码操作配合上层接口播放音频。

想要实现同样的功能,可以有多种不同的方案设计。那么多排列组合都去掌握的话,当然学不过来了。

不是说掌握技能不重要,而是说要换一种思路去学习。

技术方案排列组合有很多,但最终的业务形态是有限的呀,比如播放器、直播推拉流、音视频通话、短视频录制和编辑等,而且这些业务形态有一些技能还是通用的。

在学习音视频时,就要先设定某种业务形态,围绕这个业务去掌握一系列技能,并选择最优的解决方式。

比如想做播放器,那么先掌握用 MediaExtractor 去解封装、用 MediaCodec 解码、用 OpenGL 渲染等,然后再用 FFmpeg 去解封装和解码,这个时候完成了第一版基础技能掌握,然后再用不同的实现方案替换中间的某个环节,对比新旧方案的效率怎么样,哪个更优?

更好的方案当然要优先使用,为什么大厂的音视频体验那么好,因为他们早在各种方案中选择了最优的。

通过这样的方式学习技能,才不会因为一些新的技术出现来疲于奔命。

3. 架构

假如此时,你已经熟练使用各种音视频技能,并且对每个方案的实现优劣都很清楚,能选择最好的方案,那么恭喜你已经是一个优秀的工具人了。

为什么还要强调工具人呢,因为工具人只会实现功能,缺少了一些架构思想,而这正是进阶转变的关键之处。

同事之间经常说自己是做音视频工程的,一些特效、算法都是其他组做的,我们做的工程要很灵活的去对接和业务拓展,像剪映的编辑模块有很多功能,画中画、曲线变速、蒙版、定格、动画等,既有涉及编解码的,也有涉及效果,如果架构设计一开始没弄好的话,后面业务迅速发展,技术侧就很难保证迭代速度可以跟上业务脚步了。

这个时候光掌握一些技能就不够看了,要学会打地基,学会设计架构,从一个小的模块开始再到整体的模块。

当然架构设计也不是空中阁楼,不可能脱离业务存在的,想要做好架构设计,首先还是要理解好自己的业务,针对目前在业务上的弊端做优化,同时也多观察竞品的功能,假如现在的设计要实现竞品的功能,又会遇到哪些问题呢?另外,针对问题要能看到问题的本质,抽象出自己的理解。

除此之外,多看一些优秀的开源项目也是大有裨益的,就比如 FFmpeg 的源码和结构设计,还有 GStreamer 和 WebRTC 的源码及架构设计,这些优秀的开源库都是经受过项目考验的,仿照着学习就已经能够提高很多了。

另外,关于架构设计,目前业内经常会有交流活动,一些大厂也会在活动会议上把自己的架构方案与遇到的问题拿出来和大家分享,虽说具体的技术实现细节很少有人讲,但大的方案和趋势还是可以借鉴参考的。

后续有一些好的架构设计,也会在 音视频开发进阶 知识星球内分享给大家!

4. 实践

放在最后,也是最重要的模块,就是实践了,实践出真知。

入门或者转行音视频,理论方案说再多,还是要落实到行动上,强调实践,整起来就流弊!!!

另外,实践也要讲究环境氛围,他人的实践也可以成为你成长的台阶,就比如音视频的细节很多,我也不可能什么都搞过,但是我的同事搞过,我可以去了解他做内容,同样增加了自己的知识面,反过来亦如此。

如果你觉得自己掌握的已经够好,那么不妨跳出来试试外面的世界,也许会有更好的机会在等你。

最后给大家分享一份《音视频精编源码解析》,内容分为7个章节,涵盖 WebRTC Native 源码导读、X264 源码解读、FFmpeg、ijkplayer 源码分析系列、jsmpeg 源码解析、Live555 源码解析、Opus 源码解析,一共 675 页。

第一章 WebRTC Native 源码导读

  • 第一节-安卓相机采集实现分析
  • 第二节-安卓预览实现分析
  • 第三节-安卓视频硬编码实现分析
  • 第四节-VideoCRE 与内存抖动优化
  • 第五节-安卓 P2P 连接过程和 DataChannel 使用
  • 第六节-视频数据 native 层之旅
  • 第七节-混音
  • 第八节-P2P 连接过程完全解析
  • 第九节-API 概览
  • 第十节-RTP H.264 封包与解包


第二章 X264源码解读

  • 第一节-概述
  • 第二节-x264命令行工具
  • 第三节-编码器主干部分-2
  • 第四节-x264_slice_write()
  • 第五节-滤波(Filter)部分
  • 第六节-宏块分析(Analysis)部分-帧内宏块(Intra)


第三章 FFmpeg

  • 第一节-FFmpeg 编译和集成
  • 第二节-FFmpeg + ANativeWindow 实现视频解码播放
  • 第三节-FFmpeg + OpenSLES 实现音频解码播放
  • 第四节-FFmpeg + OpenGLES 实现音频可视化播放
  • 第五节-FFmpeg + OpenGLES 实现视频解码播放和视频滤镜
  • 第六节-FFmpeg 播放器实现音视频同步的三种方式
  • 第七节-FFmpeg + OpenGLES 实现 3D 全景播放器
  • 第八节-FFmpeg 播放器视频渲染优化
  • 第九节-FFmpeg、x264以及fdk-aac 编译整合
  • 第十节-FFmpeg 视频录制 - 视频添加滤镜和编码
  • 第十一节-FFmpeg + Android AudioRecorder 音频录制编码
  • 第十二节-Android FFmpeg 实现带滤镜的微信小视频录制功能


第四章 ijkplayer 源码分析系列

  • 第一节-整体结构总结
  • 第二节-read_thread流程
  • 第三节-解码流程
  • 第四节-渲染流程


第五章 jsmpeg 源码解析

  • 第一节-基础知识 字符处理 ArrayBuffer TypedArray
  • 第二节-TS码流 PAT PMT
  • 第三节-源码buffer.js对Uint8Array的封装
  • 第四节-源码ts.js TS格式解析流程
  • 第五节-源码mpeg1.js MPEG1码流结构
  • 第六节-概要总结


第六章 Live555源码解析

  • 第一节-GROUPSOCK
  • 第二节-MEDIUM媒体基础类
  • 第三节-MEDIASOURCE、MEDIASINK、MEDIASESSION、MEDIASUBSESSION
  • 第四节-FRAMEDSOURCE、RTPSOURCE、RTPSINK
  • 第五节-GENERICMEDIASERVER、RTSPSERVER、RTSPCLIENT
  • 第六节-testRTSPClient
  • 第七节-ServerMediaSession、ServerMediaSubsession、live555MediaServer


第七章 Opus源码解析

  • 第一节-简介
  • 第二节-编解码器使用
  • 第三节-手撸一个Opus编码程序
  • 第四节-Opus解码程序实现
  • 第五节-OggOpus封装器全解析
  • 第六节-Opus编码基础之认识声音
  • 第七节-Opus编码基础之压缩编码

Android开发想转行音视频,应该要怎么做?_音视频_06


标签:视频,FFmpeg,转行,音视频,概念,源码,Android,技能
From: https://blog.51cto.com/u_16163452/6534308

相关文章

  • “入职一年,那个被高薪挖来的Android开发被劝退了。”
    其实,在很多小伙伴的想法中,是希望通过跳槽实现薪酬涨幅,可是跳槽不是冲动后决定,应该谨慎啊~01我的学弟,最近向我吐槽,2020年上半年入职一家公司,当时是高薪挖走的他,所谓钱到位,工作也是充满干劲,不到一年的时间,参与了不少项目。可是疲于应对工作,填了不少的技术“坑”,根本没时间去提升。导......
  • 渣硕Android开发找工作都这么难了吗?千万不要轻易离职......
    坐标北京,21年3月毕业工作,北京某大型互联网码农集散基地渣硕背景。第一份工作在北京的一个80人左右规模的小公司做Android,最近刚刚跳槽成功。做Android是从19年中旬开始,毕业前的第一份工作和第二份工作都在规模不超过20人的小团队练级,毕业前本来有计划留杭州,也拿到不少心仪Offer,但是......
  • 给公司面试了五十多个Android开发,我已经吐血身亡了
    身在某二线互联网公司,面试了很多应聘安卓岗位的程序员。符合要求的很少,目前来看也就百分之五左右。我面试Android的时候一般都是先看看面试者的Java基础知识,然后是一些基本的数据结构和基本的算法。然后是一些面向对象的思想,最后是Android。因为任务基础扎实了,面向对象的思想有了,开......
  • 【金三银四】2022Android面经新鲜出炉啦
    前言春水初盛,垂钓者络绎不绝,鱼儿按捺不住,拍打着尾鳍纷纷跃出水面,沽个好价。本篇真实的记录了我从准备->复习->面试的全过程,分享一些我的真实经验,希望能帮到大家。准备工作开始准备工作之前,首先思考几个问题:如何准备需要复习哪些东西该怎么复习怎么复习最高效职业规划如何准备,从哪......
  • Android Handler消息机制详解
    在Android中,只有主线程才能更新UI,但是主线程不能进行耗时操作,否则会产生ANR异常,所以常常把耗时操作放到其他子线程进行。如果在子线程中需要更新UI,一般都是通过Handler发送消息,主线接收消息后进行相应的UI逻辑处理。一.什么是HandlerHandler是一个消息分发对象。Handler是Andr......
  • Android仿微信图片浏览
    实现原理自定义PopupWindow+RecyclerView+TouchImageViewPopupWindow与AlertDialog的区别最关键的区别是AlertDialog不能指定显示位置,只能默认显示在屏幕最中间(当然也可以通过设置WindowManager参数来改变位置)。而PopupWindow是可以指定显示位置的,十分灵活。要生成一个PopupWindow......
  • Android 的下一个风口在哪里 ? 车载、智能家具、音视频。。。
    现在客户端卷的风起云涌,很多安卓开发者都是抱怨连天。内卷之下,相比本来就堪忧的发量,前途未卜的迷茫带来的精神折磨更是雪上加霜。在突破内卷这件事儿上,很多开发者都把目光对准了车企:智能座舱、车载系统,看起来都是不错的方向。那么我们来看一看,想要成功转型,最需要具备的素质是什么:想......
  • 以阿里社招Android面试为例,详讲面对面试官到面试中到面试结束
    前言今天有个小伙伴和我说,Android技术还行,主要是对面试没什么把握,小编想了想,不该是多半面试题都会迎难而解,怎么会什么把握呢?但仔细又一想,技术和面试也是两回事,技术可以也不代表面试就可以过,那咱们就来好好叨叨该如何去面试面对面试官我在网上看到了很多面试官的分享,他们面过上百人,......
  • 写给女*友的中级Android面试秘籍(含详细答案,15k级别)
    前言本篇文章,献给我家女朋友,祝她在杭州找一个965的好公司!因为Android面试考点众多,而网上各个知识点的博客文章又太多,看的眼花缭乱……所以便整理了一下常见考点的精华回答,尽量覆盖该知识点的下容易被面试到的所有内容。面试题都整理成了PDF文档,包含Java基础、Android基础、UI控件篇......
  • 为什么Android面试总是被问到性能优化问题?
    随着Android开发越来越规范,国内工程师的素质,以及用户对产品的要求也越来越高。这也间接导致我们对研发项目的质量要求到了近乎苛刻的地步,内存优化、UI卡顿优化、App崩溃监控等性能调优也逐渐成了人手必备的技能。工作之余,难免让我们感慨学无止境,以及Android开发也是水深不......