手机mp3转ogg格式 android播放mp3文件( 三 )


1.对于延迟度要求不高 , 并且希望能够更全面的控制音乐的播放 , MediaPlayer比较适合 。2.声音短小 , 延迟度小 , 并且需要几种声音同时播放的场景 , 适合使用SoundPool 。3.播放大文件音乐 , 如WAV无损音频和PCM无压缩音频 , 可使用更底层的播放方式AudioTrack 。它支持流式播放 , 可以读取(可来自本地和 *** )音频流 , 却播放延迟较小 。4、AudioTrack直接支持WAV和PCM , 其他音频需要解码成PCM格式才能播放 。.jet的音频比较少见(有的游戏中在使用) , 可使用专门的播放器JetPlayer播放 。5.对于系统类声音的播放和操作 , Ringtone更适合 。二、音频的采集手机一般都有麦克风和摄像头 , 而Android系统就可以利用这些硬件来录制音视频了 。为了增加对录制音视频的支持 , Android系统提供了一个MediaRecorder的类 。
与MediaPlayer类非常相似MediaRecorder也有它自己的状态图 , MediaRecorder的各个状态介绍如下:
Initial:初始化状态 。使用new() *** 创建MediaRecorder对象或者调用了reset() *** 时 , 该MediaRecorder对象处于Initial状态 。Initialized:已初始化状态 , 在Initial状态调用setAudioSource()或setVideoSource() *** 进入该状态 。在这个状态可以通过setOutputFormat() *** 设置输出格式 , 此时MediaRecorder转换为DataSourceConfigured状态 。另外 , 通过reset()重新进入Initial状态 。DataSourceConfigured:数据源配置状态 , 这期间可以设定编码方式、输出文件、屏幕旋转、预览显示等等 。可以在Initialized状态通过setOutputFormat() *** 进入该状态 。可以通过prepare() *** 到达Prepared状态 。Prepared:就绪状态 , 在DataSourceConfigured状态通过prepare() *** 进入该状态 。可以通过start()进入录制状态 。另外 , 可以通过reset() *** 回到Initialized状态 。Recording:录制状态 , 通过调用start() *** 进入该状态 。另外 , 它可以通过stop() *** 或reset() *** 回到Initial状态 。Released:释放状态 , 可以通过在Initial状态调用release() *** 来进入这个状态 , 这时将会释放所有和MediaRecorder对象绑定的资源 。Error:错误状态 , 当错误发生的时候进入这个状态 , 它可以通过reset() *** 进入Initial状态 。需要说明的是 , 与MediaPlayer相似 , 使用MediaRecorder录音录像时需要严格遵守状态函数调用的先后顺序 , 在不同的状态调用不同的函数 , 否则会出现异常 。如上的文字描述可以转换为如下状态图:
三、Android中多音视频编解码音视频的原始数据非常庞大 , 难以存储和传输 。要解决音视频数据的存储和传输问题 , 需要做如下处理:
音视频编码:即对数据进行压缩 , 音视频数据压缩技术就是音视频编码 。编码的目的就是在最小图像或音频信息丢失情况下得到更大的压缩 。音视频解码:解码是相对编码的 , 其目的是更大限度的还原原始图像或声音信息 。编解码的作用:编解码的意义就是便于数据传输和存储 。而我们知道音视频编解码格式非常多(h264、h265、vp8、vp9、aac、opus……) , 实现每种编解码都需要引入外部库 , 导致项目臃肿、包体积过大且运行性能差 。
因此Google提出了一套标准 , 这就是MediaCodec 。具体来说 , 了解MediaCodec可以从以下几个方面来说:
定义:MediaCodec是Google公司专门为Android开发者和芯片厂商搭建的一套用于调用硬件编解码器组件的统一接口 , 全部遵循该接口规范即可简单的使用 , 主要的目的在于统一标准 。特点:与常规编解码库相比 , MediaCodec具有非常明显的优势 , 它速度快、效率高、CPU占用率低、内存小、节省包体积 。使用MediaCodec可以解决项目臃肿、减小包体积和提升编解码性能 。关于MediaCodec的工作原理 , 可以参见下图所示:
工作步骤如下所示:
MediaCodec处理输入数据后生成输出数据 。通过异步方式处理数据 , 并使用一组输入和输出缓冲区 。输入端:请求一个空的输入缓冲区 , 用数据填充它并将其发送到编解码器进行处理 。输出端:编解码器处理完数据并将其转换到一个空的输出缓冲区 。最后 , 请求一个已填满的输出缓冲区 , 使用它的内容并将其释放回编解码器 。可以操作的数据类型MediaCodec可以对三种数据进行操作 , 分别是:

推荐阅读