直播软件搭建Android音视频方向进阶路线及资源合集

直播软件搭建的音视频从采集到播放都经历了哪些流程呢::

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

  • 媒体部分(蓝色+绿色)
  • 传输部分(红色)

1.媒体部分

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

1.1 原始版本

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

Intent intent=new Intent();
// 指定开启系统相机的Action
intent.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官方提供了的么:github.com/android/med… 包含了MediaRecorder VideoPlayer等)是:

  1. MediaRecorder 音频/视频采集 对应上图蓝色部分, 参考 github.com/werbhelius/… 实现
  2. MediaPlayer 音频/视频播放, (VideoView封装了MediaPlayer),对应上图绿色部分 参考:github.com/crossle/Med… 实现

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.设置视频,音频的输出格式 mp4
mediaRecorder.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: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的产物,主要用于直播场景,主播一路上行,观众多路下行

  • 深入理解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:ninjanetic.com/how-to-get-…
  • WebRTC 1.0: Real-time Communication Between Browsers:www.w3.org/TR/webrtc/#…
  • Android之WebRTC介绍:www.tuicool.com/articles/Vv…
  • SDP for the WebRTC:tools.ietf.org/id/draft-na…
  • WebRTC 1.0: Real-time Communication Between Browsers:w3c.github.io/webrtc-pc/

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
  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. kn007.net/topics/deco…
  11. SimpleLivePublisher.Lite github.com/gezhaoyou/S… : 简介的Android平台直播推流

上述就是直播软件搭建Android音视频方向进阶路线及资源合集,其他资源持续整理输出中...

直播软件搭建Android音视频方向进阶路线及资源合集相关推荐

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

    音视频从采集到播放都经历了哪些流程呢:: 通过上面的图,我们简单的把音视频方向分为主要的两块: 媒体部分(蓝色+绿色) 传输部分(红色) 1.媒体部分 我们这篇文章不再从音视频专业知识开始,而从And ...

  2. 23最新《Android音视频开发进阶指南》,音视频开发者速领

    作为Android开发程序员,我们时刻站在互联网的前端,而音视频作为现在乃至未来几年一个强劲的风口,吸引了许多程序员的关注. 那么音视频开发的行业现状究竟如何呢?我们又该怎样入门呢?请看下文: 音视频 ...

  3. 堪称教科书级别的Android音视频入门进阶学习手册,开源分享

    概述 随着整个互联网的崛起,数据传递的形式也在不断升级变化,总的流行趋势如下: 纯文本的短信,QQ -> 空间,微博,朋友圈的图片文字结合 -> 微信语音 -> 各大直播软件 -&g ...

  4. 吹爆系列:教科书级别的Android音视频入门进阶学习手册,学完我成功“挤进”了抖音音视频开发岗

    Android开发工作两年,真的是感觉Android应用层开发没什么前景了,于是打算在网络安全,智能硬件,音视频这几个方向发展,考虑了一段时间,最终决定选择音视频.理由就不说了,既然选择了就要好好深耕 ...

  5. Android 音视频入门/进阶教程

    后续的音视频文章,都会在这里更新 作为安卓开发仔,对音视频这块,一直是比较感兴趣的,所以,本着学习和记录的态度,我也把我所学的知识记录起来,希望对想音视频感兴趣的小伙伴有所帮忙. 一. 基础文章系列 ...

  6. Android音视频开发进阶

    原文链接:http://www.jianshu.com/u/a32db45d4859 Android视频开发进阶(part1-关于视频的那些术语) http://www.jianshu.com/p/1 ...

  7. android音视频开发进阶指南,音视频开发进阶指南:基于Android与iOS平台的实践

    领取成功 您已领取成功! 您可以进入Android/iOS/Kindle平台的多看阅读客户端,刷新个人中心的已购列表,即可下载图书,享受精品阅读时光啦! - | 回复不要太快哦~ 回复内容不能为空哦 ...

  8. 在直播软件搭建中,如何基于rtmp实现视频直播?

    最近几年直播软件搭建可谓大火,这也就导致了在视频直播领域,有不同的商家提供各种的商业解决方案,包括软硬件设备,摄像机,编码器,流媒体服务器等.本文要讲解的是在直播软件搭建中,如何基于rtmp实现视频直 ...

  9. 企业级Android音视频开发笔记分享,快来get正确的学习姿势

    随着传统的图文媒体向以音视频为主的新媒体转变,音视频开发逐渐成为Android领域内的小热门.但音视频开发涉及的层面较广,相关的技术繁多且复杂,想要深入确有一定难度.且目前网络上关于Android 音 ...

最新文章

  1. 【Laravel学习篇 · 一】Windows下起步就遇麻烦
  2. WebUI中DataGrid多层表头的终极解决办法
  3. 样式超出设定宽度显示显示省略号
  4. ERP笔记2-善用SVN对系统环境进行配置和组织
  5. easyUI的combobox选中无法显示
  6. 在vs2012下编译出现Msvcp120d.dll 丢失的问题
  7. yum(Fedora和RedHat以及SUSE中的Shell前端软件包管理器)命令详解
  8. 爬虫实战:Requests+BeautifulSoup 爬取京东内衣信息并导入表格(python)
  9. 用scrapy框架写爬虫
  10. c语言结构体定义字符串数组,C语言,结构体中字符串的声明(采用字符指针还是字符数组)...
  11. 修改Cocos2d-X-3.2中的setup.py, 使其能用python3
  12. 一个数组去重的简单实现
  13. 怎样找回W ndows7密钥,怎么找到windows7密钥
  14. List转JSON格式方法
  15. Keras : 利用卷积神经网络CNN对图像进行分类,以mnist数据集为例建立模型并预测
  16. mSystems:苏晓泉、徐健等发布全球微生物组结构和功能搜索平台2.0
  17. Verilog HDL可综合描述(高质量Verilog书写)
  18. Scrapy 2.6 Items 数据项定义、加载、传输使用指南
  19. 现阶段为什么国内程序员无法很好的参与到开源社区?
  20. 数据库系统概论笔记——第一章

热门文章

  1. 常州信息职业技术学院计算机清考,常州信息职业技术学院教务处:http://jwc.ccit.js.cn/...
  2. 19.2、Javaweb案例_Servlet代码抽取优化分页数据redis缓存优化分页数据展示
  3. 短视频App对比分析报告
  4. 未完成版本链表通讯录脑壳疼只做了一个添加
  5. 思科模拟器服务器重置连接,TCP连接重置的一个简单的解决方法,服务器客户端均适用...
  6. js下拉列表添加监听事件(支持所有主流浏览器)
  7. 坦克大战java源码
  8. c语言中管道符作用,由Linux中管道的buffer,浅谈C语言中char类型字符串拷贝使用strcpy()和=赋值符号的区别...
  9. WZOI-263细菌繁殖
  10. 团队项目之需求规格说明书