写点什么

Android | 音视频方向进阶路线及资源合集

用户头像
轻口味
关注
发布于: 17 小时前
Android | 音视频方向进阶路线及资源合集

有 Android 开发的小伙伴问有没有系统学习音视频的路线或者资料,今天抽空写一篇文章,整理一条从难到易从浅入深的路线,并配套对应的主流代码库.


音视频从采集到播放都经历了哪些流程呢::


通过上面的图,我们简单的把音视频方向分为主要的两块:


  • 媒体部分(蓝色+绿色)

  • 传输部分(红色)


1.媒体部分


我们这篇文章不再从音视频专业知识开始,而 Android 系统 API 的角度,逐层深入.


1.1 原始版本


我们最开始接触的摄像拍照是通过 Intent 调用系统摄像头:


Intent intent=new Intent();// 指定开启系统相机的Actionintent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);intent.addCategory(Intent.CATEGORY_DEFAULT);// 根据文件地址创建文件File file=new File(FILE_PATH);// 把文件地址转换成Uri格式Uri uri=Uri.fromFile(file);// 设置系统相机拍摄照片完成后图片文件的存放地址intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
复制代码


我们要播放视频最原始的是基于 VideoView 系统控件.


但是系统相机和系统控件 VideoView 的局限性都是可定制型太差,系统相机的图像分辨率,视频码率以及 VideoView 的进度条等.


1.2 初级版本


接下来,Android 开发中我们接触到最上层的两个 API(Android 官方提供了的么:https://github.com/android/media-samples 包含了 MediaRecorder VideoPlayer 等)是:


  1. MediaRecorder 音频/视频采集 对应上图蓝色部分, 参考 https://github.com/werbhelius/MediaUtils 实现

  2. MediaPlayer 音频/视频播放, (VideoView 封装了 MediaPlayer),对应上图绿色部分 参考:https://github.com/crossle/MediaPlayerSurface 实现


MediaRecorder 示例:


mediaRecorder = new MediaRecorder(); // 创建mediaRecorder.reset(); // 设置为空闲模式 可以赋属性了mediaRecorder.setCamera(mCamera);// 设置一个摄像头用于录制。// 使用SurfaceView预览mediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
// 1.设置采集声音// mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置采集图像mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);// 2.设置视频,音频的输出格式 mp4mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);// 开始录制mediaRecorder.prepare();mediaRecorder.start();
复制代码


MediaRecorder 示例:


MediaPlayer mMediaPlayer = new MediaPlayer();mMediaPlayer.setDataSource(mContext, mUri, mHeaders);mMediaPlayer.setDisplay(mSurfaceHolder);mMediaPlayer.prepareAsync();
复制代码


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


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 主要是图形相关的,编解码器观光一下官方文档:https://developer.android.google.cn/reference/android/media/MediaCodec 已经不能再明白了.


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


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


  1. 第一个 OpenGL 程序:https://blog.csdn.net/fuyajun01/article/details/6705393

  2. 计算机图形学网络课程:http://netclass.csu.edu.cn/NCourse/hep089/term/CG_Txt_7_001.htm

  3. LearnOpenGl-CN:https://learnopengl-cn.readthedocs.io/zh/latest/01%20Getting%20started/08%20Coordinate%20Systems/

  4. opengl-tutorial:https://learnopengl-cn.readthedocs.io/zh/latest/01%20Getting%20started/08%20Coordinate%20Systems/

  5. OpenGl Pixel Buffer Object(PBO):http://www.songho.ca/opengl/gl_pbo.html

  6. OpenGL 深入探索——缓冲区对象(*BO):https://blog.csdn.net/panda1234lee/article/details/51546131

  7. OpenGL 深入探索——像素缓冲区对象 (PBO):https://blog.csdn.net/panda1234lee/article/details/51546502

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

  9. EGL API Notes

  10. Learn OpenGL ES:http://www.learnopengles.com/android-lesson-one-getting-started/

  11. OpenGL Transformation:http://www.songho.ca/opengl/gl_transform.html

  12. glsl_tutorial:http://zach.in.tu-clausthal.de/teaching/cg_literatur/glsl_tutorial/

  13. GLSL ES(OpenGL ES 着色器语言)_WebGL 笔记 9:http://www.ayqy.net/blog/glsl-es%EF%BC%88opengl-es%E7%9D%80%E8%89%B2%E5%99%A8%E8%AF%AD%E8%A8%80%EF%BC%89_webgl%E7%AC%94%E8%AE%B09/

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

  15. https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_image_base.txtOpenGL 中 FrameBuffer 使用:https://blog.csdn.net/wl_soft50/article/details/7916955


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:https://github.com/android/ndk-samples/tree/master/audio-echo

  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 终极阶段


现在你可以更深入的了解声音的本质,特性,图像的压缩原理等等,去理解时域与频域,去学习https://charlesliuyx.github.io/2018/02/18/%E3%80%90%E7%9B%B4%E8%A7%82%E8%AF%A6%E8%A7%A3%E3%80%91%E8%AE%A9%E4%BD%A0%E6%B0%B8%E8%BF%9C%E5%BF%98%E4%B8%8D%E4%BA%86%E7%9A%84%E5%82%85%E9%87%8C%E5%8F%B6%E5%8F%98%E6%8D%A2%E8%A7%A3%E6%9E%90/,这个时候可以把高等数学和线性代数翻出来了.


2.传输部分


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


  • http

  • rtmp

  • rtc


2.1 基于 http 的音视频传输


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


2.2 rtmp


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


  • 深入理解 rtmp(一)之开发环境搭建

  • 深入理解 rtmp(二)之 C++脚手架搭建

  • 深入理解 rtmp(三)之手把手实现握手协议

  • 深入理解 rtmp(四)之协议实现分析


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


2.3 rtc


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


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

  • WebRTC 1.0: Real-time Communication Between Browsers:https://www.w3.org/TR/webrtc/#intro

  • Android 之 WebRTC 介绍:https://www.tuicool.com/articles/VvueErU

  • SDP for the WebRTC:https://tools.ietf.org/id/draft-nandakumar-rtcweb-sdp-01.html

  • WebRTC 1.0: Real-time Communication Between Browsers:http://w3c.github.io/webrtc-pc/


3.资源整理


3.1 摄像头及录制相关


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

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

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

  • https://github.com/android/camera-samples : 谷歌官方 demo


3.2 webrtc


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

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

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

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

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

  6. UnityRenderStreaming(https://github.com/Unity-Technologies/UnityRenderStreaming):Streaming Server for unity

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

  8. WebRTC 拥塞控制策略(https://www.freehacker.cn/media/webrtc-gcc/)

  9. Google's BBR 拥塞控制算法如何对抗 diu 丢包(https://blog.csdn.net/dog250/article/details/52902029)

  10. RTP Media Congestion Avoidance Techniques:https://datatracker.ietf.org/wg/rmcat/charter/

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

  12. 涂鸦开源 voip:https://gitee.com/tucodec/relay_server

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

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

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

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

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

  18. WebRTC in the real world: STUN, TURN and signaling:https://www.html5rocks.com/en/tutorials/webrtc/infrastructure/

  19. WebRTC 的 Android 2 Android 实现:https://blog.csdn.net/youmingyu/article/details/53192714

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

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

  22. weizhenwei https://www.jianshu.com/u/102fafe8c6b9: Webrtc 源码分析相关博客

  23. WebRTC 代码走读(八):代码目录结构:https://blog.csdn.net/wanghorse/article/details/46387997

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


3.3 音视频标准/历史相关


  1. 编解码和视频处理技术介绍:https://wenku.baidu.com/view/0ce01567f5335a8102d220d5.html?from=search

  2. 多媒体技术基础第三方 03 章_数字声音编码:https://wenku.baidu.com/view/f098cf7202768e9951e73893.html?mark_pay_doc=2&mark_rec_page=1&mark_rec_position=4&clear_uda_param=1

  3. 音视频系统培训资料(内部):https://wenku.baidu.com/view/3fa2be7b1a37f111f0855b95.html?from=search

  4. 音视频编解码技术:https://wenku.baidu.com/view/419f8333a7c30c22590102020740be1e650ecce7.html?from=search

  5. 音视频专业知识:https://wenku.baidu.com/view/6ea5db1114791711cc7917bb.html?from=search

  6. 音视频通信基础知识:https://wenku.baidu.com/view/7d3c247624c52cc58bd63186bceb19e8b8f6ec30.html?from=search

  7. 第二章音频的数字化:https://wenku.baidu.com/view/7154440f6c85ec3a87c2c56d.html

  8. 音视频技术及发展:https://wenku.baidu.com/view/4d4f13c74028915f804dc27e.html


3.4 其他


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

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

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

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

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

  6. https://github.com/kaldi-asr/kaldi:This is the official location of the Kaldi project. http://kaldi-asr.org

  7. latelee/H264BSAnalyzer:H264(AVC) and H265(HEVC) bit stream Analyzer, VS2010 MFC project(Windows 7 x64).

  8. ZhengfengRao/rtp2mp4:recv rtp(h264+aac), save as mp4 file

  9. hmgle/h264_to_rtp:Send H264 file by RTP over UDP

  10. kn007/silk-v3-decoder:[Skype Silk Codec SDK]Decode silk v3 audio files (like wechat amr, aud files, qq slk files) and convert to other format (like mp3). Batch conversion support. https://kn007.net/topics/decoding-qq-…

  11. SimpleLivePublisher.Lite https://github.com/gezhaoyou/SimpleLivePublisherLite : 简介的 Android 平台直播推流


其他资源持续整理输出中...

发布于: 17 小时前阅读数: 14
用户头像

轻口味

关注

100位签约计划优质创作者 2017.10.17 加入

Android音视频、AI相关领域从业者

评论 (1 条评论)

发布
用户头像
图片水印问题注意一下嗷
45 分钟前
回复
没有更多了
Android | 音视频方向进阶路线及资源合集