Android 音视频开发入门指南

17人阅读 评论(0) 收藏 举报
分类:
Android 音视频开发入门指南- http://blog.51cto.com/ticktick/1956269
Android 音视频从入门到提高 —— 任务列表》,如果你认真把所有任务都完成了,你一定会成为音视频人才招聘市场的香饽饽
1. 在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView,SurfaceView,自定义 View
2. 在 Android 平台使用 AudioRecord 和 AudioTrack API 完成音频 PCM 数据的采集和播放,并实现读写音频 wav 文件
3. 在 Android 平台使用 Camera API 进行视频的采集,分别使用 SurfaceView、TextureView 来预览 Camera 数据,取到 NV21 的数据回调
4. 学习 Android 平台的 MediaExtractor 和 MediaMuxer API,知道如何解析和封装 mp4 文件
5. 学习 Android 平台 OpenGL ES API,了解 OpenGL 开发的基本流程,使用 OpenGL 绘制一个三角形
6. 学习 Android 平台 OpenGL ES API,学习纹理绘制,能够使用 OpenGL 显示一张图片
7. 学习 MediaCodec API,完成音频 AAC 硬编、硬解
8. 学习 MediaCodec API,完成视频 H.264 的硬编、硬解
9. 串联整个音视频录制流程,完成音视频的采集、编码、封包成 mp4 输出
10. 串联整个音视频播放流程,完成 mp4 的解析、音视频的解码、播放和渲染
11. 进一步学习 OpenGL,了解如何实现视频的剪裁、旋转、水印、滤镜,并学习 OpenGL 高级特性,如:VBO,VAO,FBO 等等
12. 学习 Android 图形图像架构,能够使用 GLSurfaceviw 绘制 Camera 预览画面
13. 深入研究音视频相关的网络协议,如 rtmp,hls,以及封包格式,如:flv,mp4
14. 深入学习一些音视频领域的开源项目,如 webrtc,ffmpeg,ijkplayer,librtmp 等等
15. 将 ffmpeg 库移植到 Android 平台,结合上面积累的经验,编写一款简易的音视频播放器
16. 将 x264 库移植到 Android 平台,结合上面积累的经验,完成视频数据 H264 软编功能
17. 将 librtmp 库移植到 Android 平台,结合上面积累的经验,完成 Android RTMP 推流功能
18. 上面积累的经验,做一款短视频 APP,完成如:断点拍摄、添加水印、本地转码、视频剪辑、视频拼接、MV 特效等功能

推荐的参考资料:
1. 《雷霄骅的专栏》:http://blog.csdn.net/leixiaohua1020
2. 《Android音频开发》:http://ticktick.blog.51cto.com/823160/d-15
3. 《FFMPEG Tips》:http://ticktick.blog.51cto.com/823160/d-17
4. 《Learn OpenGL 中文》:https://learnopengl-cn.readthedocs.io/zh/latest/

5. 《Android Graphic 架构》:https://source.android.com/devices/graphics/

----------------------------------------

Android 视频分离和合成(MediaMuxer和MediaExtractor)-
https://github.com/RrtoyewxXu/AndroidLiveRecord/tree/master/mediaexactorandmediamuxerdemo

GraphicsTestBed 滤镜处理和OpenGLES进阶- https://github.com/lb377463323/GraphicsTestBed
AndroidLiveRecord视频分离和合成,MediaExtractor和MediaMuxer的Demo- https://github.com/RrtoyewxXu/AndroidLiveRecord/tree/master/mediaexactorandmediamuxerdemo
   在Android的多媒体类中,MediaMuxer和MediaCodec算是比较年轻的,它们是JB 4.1和JB 4.3才引入的。前者用于将音频和视频进行混合生成多媒体文件。缺点是目前只能支持一个audio track和一个video track,而且仅支持mp4输出。不过既然是新生事物,相信之后的版本应该会有大的改进。MediaCodec用于将音视频进行压缩编码,它有个比较牛X的地方是可以对Surface内容进行编码,如KK 4.4中屏幕录像功能就是用它实现的。
  MediaExtractor用于音视频分路,和MediaMuxer正好是反过程。MediaFormat用于描述多媒体数据的格式。MediaRecorder用于录像+压缩编码,生成编码好的文件如mp4, 3gpp,视频主要是用于录制Camera preview。MediaPlayer用于播放压缩编码后的音视频文件。AudioRecord用于录制PCM数据。AudioTrack用于播放PCM数据。PCM即原始音频采样数据,可以用如vlc播放器播放。
  MediaExtractor类,可以用来分离容器中的视频track和音频track.

  opengl渲染的整个过程。openGL采用cs模型:c是cpu,s是GPU,c给s的输入是vertex信息和Texture信息,s的输出是显示器上显示的图像。
  几何顶点数据包括模型的顶点集、线集、多边形集,这些数据经过流程图的上部,包括运算器、逐个顶点操作等;图像数据包括象素集、影像集、位图集等,图像象素数据的处理方式与几何顶点数据的处理方式是不同的,但它们都经过光栅化、逐个片元(Fragment)处理直至把最后的光栅数据写入帧缓冲器。在OpenGL中的所有数据包括几何顶点数据和象素数据都可以被存储在显示列表中或者立即可以得到处理。OpenGL中,显示列表技术是一项重要的技术。
  OpenGL要求把所有的几何图形单元都用顶点来描述,这样运算器和逐个顶点计算操作都可以针对每个顶点进行计算和操作,然后进行光栅化形成图形碎片;对于象素数据,象素操作结果被存储在纹理组装用的内存中,再象几何顶点操作一样光栅化形成图形片元。
  整个流程操作的最后,图形片元都要进行一系列的逐个片元操作,这样最后的象素值BZ送入帧缓冲器实现图形的显示。 
  
  OpenGL中的坐标是带有深度信息的三维坐标,把这些三维坐标转换成可以在LCD上显示的二维坐标,这个过程叫做pipeline。pipeline分为以下两个步骤: 
第一步:将坐标值由3D的转换成2D。 
第二步:对第一步中的2D坐标赋予颜色值(RGBA)。

AndroidOpenGLDemo- https://github.com/doggycoder/AndroidOpenGLDemo

android-openGL-canvas- https://github.com/ChillingVan/android-openGL-canvas

> 学习 MediaCodec API,完成音频 AAC 硬编、硬解;学习 MediaCodec API,完成视频 H.264 的硬编、硬解
mp3文件转码为aac音频文件
转码实现原理:mp3->pcm->aac,首先将mp3解码成PCM,再将PCM编码成aac格式的音频文件。

码率控制模式有三种:
1.CQ  表示完全不控制码率,尽最大可能保证图像质量;
2.CBR 表示编码器会尽量把输出码率控制为设定值,即我们前面提到的“不为所动”;
3.VBR 表示编码器会根据图像内容的复杂度(实际上是帧间变化量的大小)来动态调整输出码率,图像复杂则码率高,图像简单则码率低;

Android 流控策略选择:
1.质量要求高、不在乎带宽、解码器支持码率剧烈波动的情况下,可以选择 CQ 码率控制策略。
2.VBR 输出码率会在一定范围内波动,对于小幅晃动,方块效应会有所改善,但对剧烈晃动仍无能为力;连续调低码率则会导致码率急剧下降,如果无法接受这个问题,那 VBR 就不是好的选择。
3.CBR 的优点是稳定可控,这样对实时性的保证有帮助。所以 WebRTC 开发中一般使用的是CBR。

音视频的编码方式分为两种:
  硬编码:用设备GPU去实现编解码,这样可以减轻CPU的压力。
  软编码:让CPU来进行编解码,在c层代码来进行编解码,因为c/c++有很多好的编解码库。

通过Camera采集NV21数据编码为H.264视频文件并保存;
通过Camera2采集YV12数据编码为H.264视频文件并保存;
通过SurfaceView解码显示Camera编码保存的H.264视频文件;

通过TextureView解码显示Camera编码保存的H.264视频文件;


> MediaCodec编码解码音频AAC
 H264,AAC解码Demo下载地址:http://download.csdn.net/detail/a512337862/9882200 。附带aac以及H264文件以及源码
 AudioTrack主要是用来进行主要是用来播放声音的,但是只能播放PCM格式的音频流。
 mp3转码成aac为例,转码实现原理:mp3->pcm->aac,首先将mp3解码成PCM,再将PCM编码成aac格式的音频文件。
 mime:用来表示媒体文件的格式 mp3为audio/mpeg;aac为audio/mp4a-latm;mp4为video/mp4v-es;音频前缀为audio,视频前缀为video 我们可用此区别区分媒体文件内的音频轨道和视频轨道

  Android MediaCodec 音频转码——硬编硬解- https://blog.csdn.net/qq_28251907/article/details/78565227
 Android多媒体之 wav和amr的互转- https://blog.csdn.net/honeybaby201314/article/details/50379040
使用的aac的采样率一般是44100Hz,但是amr的采样率一般设置为8000Hz,所以将aac转为amr时需要downSample,将采样率从44100 变为8000,upsampling/downsampling- https://github.com/hutm/JSSRC
 wav2amr-  https://github.com/kevinho/opencore-amr-android

  音频(一) - 音频基础知识- https://blog.csdn.net/kevindgk/article/details/52924779
 MediaCodec可以处理的数据有以下三种类型:压缩数据、原始音频数据、原始视频数据。
 Android端的音频技术,包括音频的录制、播放、降噪、压缩,以及在局域网中的实时传输等。

 音频的使用场景:
音频播放器,录音机,语音电话,音视频监控应用,音视频直播应用,音频编辑/处理软件,蓝牙耳机/音箱等。

 音频开发的具体内容:
(1)音频采集/播放
(2)音频算法处理(去噪、静音检测、回声消除、音效处理、功放/增强、混音/分离等)
(3)音频的编解码和格式转换
(4)音频传输协议的开发(SIP,A2DP、AVRCP等)

 延时敏感、卡顿敏感、噪声抑制(Denoise)、回声消除(AEC)、静音检测(VAD)、混音算法等.
 根据编码方式的不同,音频编码技术分为三种:波形编码、参数编码和混合编码。一般来说,波形编码的话音质量高,但编码速率也很高;参数编码的编码速率很低,产生的合成语音的音质不高;混合编码使用参数编码技术和波形编码技术,编码速率和音质介于它们之间。
 脉冲代码调制编码,即PCM编码。PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码。
 在计算机应用中,能够达到最高保真水平的就是PCM编码,被广泛用于素材保存及音乐欣赏,CD、DVD以及我们常见的WAV文件中均有应用。常用的音频采样频率有8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。

  码率 = 采样频率 * 量化位数 * 声道个数
 音频数据是流式的,本身没有明确的一帧帧的概念,在实际的应用中,为了音频算法处理/传输的方便,一般约定俗成取2.5ms~60ms为单位的数据量为一帧音频。这个时间被称之为“采样时间”,其长度没有特别的标准,它是根据编解码器和具体应用的需求来决定的,我们可以计算一下一帧音频帧的大小。

假设某通道的音频信号是采样率为8kHz,位宽为16bit,20ms一帧,单通道,则一帧音频数据的大小为:
int size = 8000 x 16bit x 0.02s x 1 = 2560 bit = 320 byte = 160 short

 常见的编码方式有:PCM 和 ADPCM,这些数据代表着无损的原始数字音频信号,添加一些文件头信息,就可以存储为WAV文件了,它是一种由微软和IBM联合开发的用于音频数字存储的标准,可以很容易地被解析和播放。

  音频开发的Android API:
音频采集:  MediaRecoder,AudioRecord
音频播放:  SoundPool,MediaPlayer,AudioTrack
音频编解码: MediaCodec
NDK API:     OpenSL ES

音频处理的开源库:Speex、WebRTC、Opus等

> MediaCodec编码解码视频H.264,
  MediaCodec硬解码实现RTSP+H264实时视频播放完整功能可以参考:
https://github.com/ldm520/ANDROID_MEDIACODEC_RTSP_H264
 在Android里,最常用的视频编码解码用的API就是mediacodec了,可以进行多种格式的硬解码,也能和mediamuxer一起使用实现音视频文件的编辑(结合MediaExtractor),用OpenGL绘制Surface并生成mp4文件,屏幕录像以及类似Camera app里的录像功能(虽然这个用MediaRecorder更合适)等
  MediaExtractor用于音视频分路,和MediaMuxer正好是反过程。MediaFormat用于描述多媒体数据的格式。MediaRecorder用于录像+压缩编码,生成编码好的文件如mp4, 3gpp,视频主要是用于录制Camera preview。MediaPlayer用于播放压缩编码后的音视频文件。AudioRecord用于录制PCM数据。AudioTrack用于播放PCM数据。PCM即原始音频采样数据,可以用如vlc播放器播放。

 【Android 多媒体应用】使用MediaCodec将摄像头采集的视频编码为h264- https://www.cnblogs.com/CoderTian/p/6224605.html
android编码h264(二):MediaCodec 硬编码 h264(硬编码)- https://blog.csdn.net/ss182172633/article/details/50256733  https://github.com/sszhangpengfei/MediaCodecEncodeH264

  IDR帧:IDR帧属于I 帧。解码器收到IDR frame时,将所有的参考帧队列丢弃 ,这点是所有I 帧共有的特性,但是收到IDR帧时,解码器另外需要做的工作就是:把所有的PPS和SPS参数进行更新。由此可见,在编码器端,每发一个 IDR,就相应地发一个 PPS&SPS_nal_unit
  I帧:帧内编码帧是一种自带全部信息的独立帧,无需参考其它图像便可独立进行解码,视频序列中的第一个帧始终都是I帧。
  P帧:前向预测编码帧
  B帧:双向预测内插编码帧

查看评论

Android音视频开发入门指南

《Android 音视频从入门到提高 —— 任务列表》 1. 在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView,SurfaceView,自定义 View 2...
  • u011625768
  • u011625768
  • 2018-03-18 19:02:44
  • 114

Android音视频开发进阶

原文链接:http://www.jianshu.com/u/a32db45d4859 Android视频开发进阶(part1-关于视频的那些术语)  http://www.jianshu.com/...
  • gaiyindexingqiu
  • gaiyindexingqiu
  • 2017-06-08 16:29:45
  • 1957

短视频客户端SDK设计与实现

直播与短视频相继爆发,也促使众多企业纷纷加入其中,对于许多传统企业和中小企业而言音视频开发成为了最大难点,而视频云客户端SDK也就无疑成为了不错的选择。本文是全民快乐研发高级总监展晓凯在LiveVid...
  • vn9PLgZvnPs1522s82g
  • vn9PLgZvnPs1522s82g
  • 2018-01-09 00:00:00
  • 325

从开发小白到音视频专家

作者:卢俊,七牛云客户端团队技术负责人。拥有丰富的音视频领域的开发和实战经验,先后开发过 Android 播放 SDK、Android 推流 SDK、短视频 SDK,并主导了七牛连麦系统的设计和实现。...
  • dev_csdn
  • dev_csdn
  • 2017-12-07 10:53:20
  • 7574

SOCKET : TCP和UDP区别的体现??

TCP的可靠性,UDP的不可靠性,体现在哪里? 看 孙鑫VC++深入详解 TCP和UDP聊天程序,在聊天双方有一边断开时,我能感觉到“TCP的可靠性,UDP的不可靠性”;那如果聊天双方都未断开,双方...
  • Arshavin_Cannavaro
  • Arshavin_Cannavaro
  • 2012-03-10 21:31:40
  • 430

计算机系本科生编程进阶指南

我是一名普通本科计算机系在读生,热爱编程,沉迷于coding的“创造力”。 编程的世界很美妙,然而信息繁杂,方向甚多,想要全部掌握肯定很难,所以,我个人认为有一篇指南性的文章帮助大家筛选出好的书籍、...
  • sixdaycoder
  • sixdaycoder
  • 2015-09-16 10:08:02
  • 2548

音视频开发——概述(含TUTK demo iOS)

开发一款播放器,难不难,要怎么做?想必每个进入到音视频领域的新人都有这样的疑问。     如果仅仅是完成项目,可以说很简单。对于iOS开发人员,网上有不少的开源播放器,如kxmovie、ikjplay...
  • a411358606
  • a411358606
  • 2016-08-10 15:41:19
  • 3921

Android音频开发(1):基础知识

作者:卢俊 链接:https://zhuanlan.zhihu.com/p/20627525 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 先来点闲言碎...
  • u010880786
  • u010880786
  • 2016-05-28 10:06:13
  • 2754

手机音视频应用开发前景

手机音视频应用开发前景 这些年,我们看到了许许多多新的趋势在数字领域里出现,未来发展将成为继宽带后手机平台发展的又一个推动力,为手机平台的发展提供一个新的平台、使得手机平台更加的普及,并以移动应用固...
  • bairui_Allen
  • bairui_Allen
  • 2013-04-17 16:43:22
  • 667

Android多媒体应用开发实战详解:图像、音频、视频、2D和3D

  • 2018年03月01日 23:42
  • 44.13MB
  • 下载
    个人资料
    持之以恒
    等级:
    访问量: 77万+
    积分: 1万+
    排名: 1518
    最新评论