写点什么

Android _ 音视频方向进阶路线及资源合集,最新 Android 面试题整理

作者:嘟嘟侠客
  • 2021 年 11 月 27 日
  • 本文字数:5637 字

    阅读完需:约 18 分钟

mMediaPlayer.setDisplay(mSurfaceHolder);mMediaPlayer.prepareAsync();


示例代码简单介绍了一下 MediaRecorder 和 MediaRecorder 的 API,参考上面提供的 demo 已经可以实现简单的播放器和音视频录制功能了.上面我们又引出两个接口来:Camera, Surface. 拍照等功能我们都可以使用 Camera 的接口实现,关于 Camera 的 API 可以参考 google 的 demo:github.com/googlearchi… Surface 我们接下来介绍.

1.3 进阶版本

上面的的 MediaRecorder,MediaPlayer 直接封装了图中的蓝色部分与绿色部分.它们将输入编码复用以及解码解复用输出封装到了一起,可定制性差: 1.MediaPlayer 只支持固定的编码和封装,不支持 rtmp 等 2.MediaRecorder 无法支持 mp3,opus, ogg 等编码,无法对采集到音视频做预处理(比如变声,美颜等)


基于上述几个原因,我们再认识几个 API:


  1. 视频采集 Camera

  2. 音频采集 AudioRecorder

  3. 视频预处理:SurfaceTexture, Surface, EGL ,GLES10

  4. 音视频编码 MediaCodec MediaFormat

  5. 音视频封装(复用) MediaMuxer

  6. 音视频(解复用) MediaExtractor

  7. 音视频解码 MediaCodec

  8. 视频预览 SurfaceView, GLSurfaceView, TextureView

  9. 音频播放 AudioTrack


上述 API Android 也为我们提供了示例https://github.com/google/grafika,里面包含的示例相当全面:


  1. Play video (TextureView). 基于 MediaCodec ,MediaExtractor, TextureView 封装的播放器,可以帮助理解这几个 api.

  2. Continuous capture. 基于 Camera,GLES20,SurfaceTexture,SurfaceView,MediaCodec 实现的建议的视频录制器.

  3. Double decode. 类似于 Play video 示例,只是解码两路视频渲染到 TextureView.

  4. Hardware scaler exerciser. 演示 OpenGL 进行画面缩放

  5. Live camera (TextureView). 演示 Camera,SurfaceTexture 以及 TextureView 使用

  6. Multi-surface test. 演示三路视频渲染

  7. Play video (SurfaceView). 类似于 Play video (TextureView),只是输出从 TextureView 变成了 SurfaceView.

  8. Record GL app. 基于 FBO 同时将摄像头采集数据输出到编码器和屏幕,FBO 是实时美颜的关键技术.

  9. Record Screen using MediaProjectionManager.基于 MediaProjectionManager 将屏幕内容录制成文件.之前我们的输入都是摄像头,Android5.0 开始提供了 MediaProjectionManager,可以对屏幕内容进行采集.

  10. Scheduled swap. 了解一个新伙伴 Choreographer

  11. Show + capture camera. 摄像头同时输出到文件和屏幕(与"RecordFBOActivity"输出对象变成了 GLSurfaceView)

  12. Simple Canvas in TextureView. 一般的我们把基于 OpenGL 的渲染称为"硬"渲染,基于 Canvas 的称为"软"渲染,这个示例展示了如何通过 Canvas 绘制到 TextureView

  13. Simple GL in TextureView. 可以理解为实现了 GLThread 的 TextureView.

  14. Texture from Camera. Camera->SurfaceTexture->SurfaceView

  15. Color bars. Canvas 绘制示例

  16. OpenGL ES Info. 获取 OpenGL 版本等相关信息

  17. glTexImage2D speed test. 纹理上传示例,从图片装换为 OpenGL 纹理,又要认识一个新伙伴: glTexImage2D().

  18. glReadPixels speed test. OpenGL 纹转换为图片(RGBA/YUV),再认识一个新伙伴 glReadPixels()


上面的 demo 主要是图形相关的,编解码器观光一下官方文档:developer.android.google.cn/reference/a… 已经不能再明白了.




此外,想弄明白 MediaCodec,还需要了解一个数据结构 ByteBuffer(移步官方文档了解一下? developer.android.google.cn/reference/j…)


如果学习完这些,那么恭喜你,你已经对音视频相关知识有了一些了解了.接下来你可以试着去接触一下著名的android-gpuimage,以及了解 OpenGL 相关的 FBO,PBO,Texture 等,可以处理视频编辑,简单实现美颜等滤镜了. 推荐一些 OpenGL 相关文章:


  1. 第一个 OpenGL 程序:blog.csdn.net/fuyajun01/a…

  2. 计算机图形学网络课程:netclass.csu.edu.cn/NCourse/hep…

  3. LearnOpenGl-CN:learnopengl-cn.readthedocs.io/zh/latest/0…

  4. opengl-tutorial:learnopengl-cn.readthedocs.io/zh/latest/0…

  5. OpenGl Pixel Buffer Object(PBO):www.songho.ca/opengl/gl_p…

  6. OpenGL 深入探索——缓冲区对象(*BO):blog.csdn.net/panda1234le…

  7. OpenGL 深入探索——像素缓冲区对象 (PBO):blog.csdn.net/panda1234le…

  8. Android 关于美颜/滤镜 利用 PBO 从 OpenGL 录制视频:www.jianshu.com/p/3bc4db687…

  9. EGL API Notes

  10. Learn OpenGL ES:www.learnopengles.com/android-les…

  11. OpenGL Transformation:www.songho.ca/opengl/gl_t…

  12. glsl_tutorial:zach.in.tu-clausthal.de/teaching/cg…

  13. GLSL ES(OpenGL ES 着色器语言)_WebGL 笔记 9:www.ayqy.net/blog/glsl-e…

  14. OpenGL 纹理坐标 和 顶点坐标映射关系 详解:blog.csdn.net/xipiaoyouzi…

  15. www.khronos.org/registry/EG… OpenGL 中 FrameBuffer 使用:blog.csdn.net/wl_soft50/a…

1.4 高级版本

进阶版本中处理的都是 Java 层数据,有时候我们要编码 mp3,opus 等,手机硬件编码器(就是 MediaCodec)不支持,我们需要引入编解码器库(lame,opus),这些库都是 c/cpp 实现,我们要经过 jni 封装,但是 jni 是有消耗的,那么我们可以不可以直接在 c/cpp 层实现采集,编码,播放呢? 当然是 YES,下面我们再来了解一下 jni 层的 API:


  1. 图像采集: 图像采集可以使用 Java Camera,通过给 Camera Surface,Surface 再给 jni 的 MediaCodec,也可以试试<camera/NdkCameraManager.h>

  2. 声音采集: 了解一下<SLES/OpenSLES_Android.h> , <SLES/OpenSLES.h>, opensl 的文档太粗陋,给你一份 Android 官方 demo:github.com/android/ndk…

  3. 编解码: 了解一下<media/NdkMediaCodec.h>

  4. 封装(复用)器: <media/NdkMediaMuxer.h>

  5. 解封装(解复用)器: <media/NdkMediaExtractor.h>

  6. 图像渲染: ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include下的 EGL, GLES, GLES2, GLES3 等



如果了解到这,那么恭喜你,可以继续学习一些其他库了:


  1. lamemp3:Android 只支持 mp3 解码,不支持 mp3 编码,幸好有 lame:官网, 使用示例 文章介绍: 带你写一个Mp文件解析器-Mp3文件结构全解析(一),带你写一个Mp文件解析器-Mp3文件结构全解析(二)

  2. opus: 实时语音场景的首选是 opus,但是 Android 还是只能解码不能编码,索性移步:官网,文章介绍Opus从入门到精通(一):简介,Opus从入门到精通(二):编解码器使用, Opus从入门到精通(三)手撸一个Opus编码程序,Opus从入门到精通(四)Opus解码程序实现,Opus从入门到精通(五)OggOpus封装器全解析,学习到这应该不再需要 demo 了,自己动手来一个吧

  3. aac: Android 支持了 aac 硬件编解码,但是出于编码效率以及低端手机考虑,了解一下FAAC

  4. x264: Android 默认支持了 h264 的编解码,但也是出于编码效率及低端手机考虑,了解一下x264

  5. ffmpeg: 现在终于可以了解下传说中的 ffmpeg 了,音视频界的万能神器.

1.5 终极阶段

现在你可以更深入的了解声音的本质,特性,图像的压缩原理等等,去理解时域与频域,去学习charlesliuyx.github.io/2018/02/18/…,这个时候可以把高等数学和线性代数翻出来了.

2.媒体部分

传输部分我们音视频领域主要用到的应用层协议:


  • http

  • rtmp

  • rtc

2.1 基于 http 的音视频传输

Android 上面的系统播放器 MediaPlayer 默认支持 http 的,可以传入一个远程的 mp4 地址给 MediaPlayer 播放.但是这种只能实现点播,如果要在 http 上实现直播的话,了解一下 HLS 以及 HttpFLV:www.jianshu.com/p/32417d8ee…

2.2 rtmp

rtmp 是 adobe 的产物,主要用于直播场景,主播一路上行,观众多路下行



具体资源,文章里都有介绍了

2.3 rtc

rtmp 实现了直播,但要互动直播就需要 rtc 了.现在好多都是基于 webrtc 的二次开发.


  • How to get started with WebRTC and iOS without wasting 10 hours of your life:ninjanetic.com/how-to-get-…

  • WebRTC 1.0: Real-time Communication Bet


《Android 学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享


ween Browsers:www.w3.org/TR/webrtc/#…


3.资源整理

3.1 摄像头及录制相关

  • github.com/aserbao/And… : 自定义 Android 相机(仿抖音),其中功能包括视频人脸识别贴纸,分段录制,回滚删除,倒计时录制,视频裁剪,视频帧处理,获取视频第一帧,关键帧,视频旋转,滤镜添加,水印添加,Gif 合成到视频,文字转视频,图片转视频,音视频合成,音频变声处理,SoundTouch,Fmod 音频处理。

  • github.com/CJT2325/Cam… : 仿微信拍照 Android 控件(轻触拍照,长按摄像)

  • github.com/wuhaoyu1990… : Real-time Filter Camera&VideoRecorder And ImageEditor With Face Beauty For Android---包含美颜等 40 余种实时滤镜相机,可拍照、录像、图片修改,吸取了 gpuimage 很多滤镜

  • github.com/android/cam… : 谷歌官方 demo

3.2 webrtc

  1. Pion WebRtc(github.com/pion/webrtc ):Pure Go implementation of the WebRTC API

  2. WebRtc 学而思镜像(gitlab.com/webrtc-mirr…):

  3. WebRtc 声网镜像(webrtc.agora.io/mirror/)

  4. Flutter-p2p-engine(gitee.com/cdnbye/flut…):Flutter 视频/直播 APP 省流量 &加速,基于 webrtc

  5. Android-p2p-engine(gitee.com/cdnbye/andr…):传输能力基于 WebRTC Datachannel,可以与 CDNBye 的 Web 端插件互联互通

  6. UnityRenderStreaming(github.com/Unity-Techn…):Streaming Server for unity

  7. WebRTC 的拥塞控制和带看策略(mp.weixin.qq.com/s/Ej63-FTe5…):

  8. WebRTC 拥塞控制策略(www.freehacker.cn/media/webrt…)

  9. Google's BBR 拥塞控制算法如何对抗 diu 丢包(blog.csdn.net/dog250/arti…)

  10. RTP Media Congestion Avoidance Techniques:datatracker.ietf.org/wg/rmcat/ch…

  11. medooze/media-server(github.com/medooze/med…):WebRTC Media Server

  12. 涂鸦开源 voip:gitee.com/tucodec/rel…

  13. Jackarain/avplayer(github.com/Jackarain/a…):一个基于 FFmpeg、libtorrent 的 P2P 播放器实现

  14. EricssonResearch/openwebrtc:A cross-platform WebRTC client framework based on GStreamer www.openwebrtc.org

  15. webrtc/apprtc: The video chat demo app based on WebRTC. This project is currently on HOLD with minimal maintenance. appr.tc

  16. AirenSoft/OvenMediaEngine: OvenMediaEngine (OME) is a streaming engine for real-time live broadcasting with ultra-low latency. OvenMediaEngine.com/ome

  17. runner365/read_book:一点点从基础做起 从音视频协议原文精读翻译做起,欢迎交流指导!

  18. WebRTC in the real world: STUN, TURN and signaling:www.html5rocks.com/en/tutorial…

  19. WebRTC 的 Android 2 Android 实现:blog.csdn.net/youmingyu/a…

  20. webrtc 进阶-信令篇-之四: 如何为 WebRTC 项目选择信令协议

  21. pristineio/webrtc-build-scripts: A set of build scripts useful for building WebRTC libraries for Android and iOS.

  22. weizhenwei www.jianshu.com/u/102fafe8c… Webrtc 源码分析相关博客

  23. WebRTC 代码走读(八):代码目录结构:blog.csdn.net/wanghorse/a…

  24. WEBRtc 相关:www.wolfcstech.com/archives/

3.3 音视频标准/历史相关

  1. 编解码和视频处理技术介绍:wenku.baidu.com/view/0ce015…

  2. 多媒体技术基础第三方 03 章_数字声音编码:wenku.baidu.com/view/f098cf…

  3. 音视频系统培训资料(内部):wenku.baidu.com/view/3fa2be…

  4. 音视频编解码技术:wenku.baidu.com/view/419f83…

  5. 音视频专业知识:wenku.baidu.com/view/6ea5db…

  6. 音视频通信基础知识:wenku.baidu.com/view/7d3c24…

  7. 第二章音频的数字化:wenku.baidu.com/view/715444…

  8. 音视频技术及发展:wenku.baidu.com/view/4d4f13…

3.4 其他

  1. rainfly123/flvmuxer(github.com/rainfly123/…):This tool is used to encapsulate H264 and AAC to RTMP

  2. ant-media/LibRtmp-Client-for-Android(github.com/ant-media/L…):It is probably the smallest(~60KB, fat version ~300KB) rtmp client for android. It calls librtmp functions over JNI interface antmedia.io

  3. video-dev/hls.js(github.com/video-dev/h…):JavaScript HLS client using Media Source Extension hls-js.netlify.com/demo

  4. rao1219/VideoAnalysisTool(github.com/rao1219/Vid…):这是一款视频分析处理工具,目前嵌入了 Visual Tracking 功能,手动勾选视频中第一帧的某个物体,程序自动跟踪该物体在整个视频序列中的位置

  5. github.com/guoguo11/JS… JNI 调用 C 实现.speex 转换为.wav;使用场景:微信高清语音.speex 解码为.wav

  6. github.com/kaldi-asr/k… is the official location of the Kaldi project. kaldi-asr.org

文末

好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。


这里放上一部分我工作以来以及参与过的大大小小的面试收集总结出来的相关的几十套腾讯、头条、阿里、美团等公司 21 年的面试专题,其中把技术点整理成了视频和 PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分免费分享给大家,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~


还有 高级架构技术进阶脑图、Android 开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。


【Android 核心高级技术 PDF 文档,BAT 大厂面试真题解析】



【延伸 Android 必备知识点】



这里只是整理出来的部分面试题,后续会持续更新,希望通过这些高级面试题能够降低面试 Android 岗位的门槛,让更多的 Android 工程师理解 Android 系统,掌握 Android 系统。喜欢的话麻烦点击一个喜欢在关注一下~


本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

用户头像

嘟嘟侠客

关注

还未添加个人签名 2021.03.19 加入

还未添加个人简介

评论

发布
暂无评论
Android _ 音视频方向进阶路线及资源合集,最新Android面试题整理