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


在开发上 , 习惯的将音频、视频功能的使用称之为多媒体 , 实际上如果讲的宽泛一些的话 , 相机的使用 , 比如拍照 , 录制视频等 , 也可以划分到多媒体的范畴里面 。
从本节课开始 , 我们就来看看Android中多媒体的API使用和具体的功能 。
本篇文章我们先从音频开发聊起 。
零、音频开发场景、内容和基本概念在说音频开发之前 , 我们可以先想一想自己琢磨一下 , 哪些应用场景会用到音频开发 。主要的应用场景大致包括:
音频播放器录音机语音 *** 音视频监控应用音视频直播应用音频编辑/处理软件蓝牙耳机/音箱… …如果我们要成系统的学习多媒体和音视频的开发 , 大致会有涉及到哪些方面的知识呢 , 归纳来看主要有一下几个方面的内容:
音频采集/播放:已有音频如何播放;如何采集一段音频;音频算法处理:主要包括去噪、静音检测、回声消除、音效处理、功放/增强、混音/分离 , 等等音频的编解码和格式转换:不同格式之间的转码操作音频传输协议的开发:主要包括SIP , A2DP、AVRCP , 等等另外 , 如果要进行音频开发 , 需要了解一些音频的概念作为前置知识 , 一些常见的概念如下所示:
SampleRate:采样率 , 每秒采集声音的数量 , 它用赫兹(Hz)来表示 。采样频率越高 , 音频质量越好 。常用的音频采样频率有:8kHz、16kHz、44.1kHz、48kHz 等 。Channel:声道数 , 表示声音录制时的音源数量或回放时相应的扬声器数量 。常用的是单声道(Mono)和双声道(Stereo) 。要记住这两个词:Stereo和Mono 。BitDepth:采样精度 , 每个采样点用多少数据量表示 , 它以位(Bit)为单位 。位数越多 , 表示得就越精细 , 声音质量自然就越好 , 当然数据量也越大 。常见的位宽是:8bit 或者 16bit 。BitRate:比特率 , 每秒音频占用的比特数量 , 单位是 bps(Bit Per Second) , 比特率越高 , 压缩比越小 , 声音质量越好 , 音频体积也越大 。一、音频播放说到音视频多媒体 , 首先就有一个概念叫:媒体格式 。也就是我们常说的不同格式的音视频文件 。在Android这个***系统平台中 , 支持的媒体格式还是很丰富的 , 详细内容如下:
音频格式和编解码器总结来说 , Android中常见的音频压缩格式有:MP3 , AAC , OGG , WMA , Opus , FLAC , APE , m4a , AMR , 等等 。
1.1 音频的播放1.1.1 MediaPlayer首先认识两个基础的概念和API:
MediaPlayer:用于播放声音和视频的主要 API 。Android 多媒体框架支持播放各种常见媒体类型 , 可以轻松地将音频、视频和图片集成到应用中 。可以使用 MediaPlayer API , 播放存储在应用资源(原始资源)内的媒体文件、文件系统中的独立文件或者通过 *** 连接获得的数据流中的音频或视频 。AudioManager:该类API用于管理设备上的音频源和音频输出 。另外需要说一下 , MediaPlayerl除了能够获取、解码以及播放音频和视频 , 而且只需很简单的设置即可以外 。它还支持多种不同的媒体源 , 比如:
本地资源:即res目录下的音频资源 。URI:比如可能是通过Content Provider解析到的某个资源URI *** :通过 ***  , 获取流式传输数据进行播放 。使用步骤1、初始化MediaPlayer对象2、准备播放工作:准备工作主要是音频数据源的获取或者是音频数据的解码操作等 , 该过程属于耗时操作 , 因此需要在工作线程中进行 。3、音频状态管理:在准备工作过后 , 可以对音频进行播放、暂停等操作 。同时需要注意的是MediaPlayer是有状态的 , 包括:Idle、Initialized、Prepared、Started、Paused、PlaybackCompleted等状态 。当在进行状态的切换时 , 需要注意几个点:① Started(开始)/Paused(暂停)到Stopped(停止)是单向转换 , 无法再从Stopped直接转换到Started , 需要经历Prepared重新装载才可以重新播放 。② Initialized(初始化)状态需要装载数据才可以进行start()播放 , 但是如果使用prepareAsync() *** 异步准备 , 需要等待准备完成再开始播放 , 这里需要使用一个回调 *** :setOnPreparedListener() , 它会在异步装载完成后调用 。③ End(结束)状态是游离在其他状态之外的 , 在任何状态皆可切换 , 一般在不需要继续使用MediaPlayer的时候 , 才会使用release()回收资源 。④ Error(错误)状态是游离在其他状态之外的 , 只有在MediaPlayer发生错误的时候才会转换 。为了保持应用的用户体验 , 通常会监听setOnErrorListener()回调 ***  , 它会在MediaPlayer发生错误的时候被回调 。注意事项1、使用Service播放音频 。在使用MediaPlayer播放音频流时 , 推荐使用一个Service来承载MediaPlayer , 而不是直接在Activity里使用 。2、使用唤醒锁 。Android系统的功耗设计里 , 为了节约电池消耗 , 如果设备处于睡眠状态 , 系统将试图降低或者关闭一些没设备必须的特性 , 包括CPU和Wifi硬件 。如果是一个后台播放音乐的应用 , 降低CPU可能导致在后台运行的时候干扰音频的正常播放 , 关闭Wifi将可能导致 *** 音频流的获取出现错误 。因此为了保证功能的正常使用 , 我们必须阻止系统关闭服务 。可以使用wake locks(唤醒锁) , 它会告诉系统你正在使用某些功能 , 这样就可以一直保持该功能处于唤醒状态 , 即使锁屏无操作也能继续使用 。这个锁会在paused和stoped状态下释放 。1.1.2 SoundPool如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了 。因为MediaPlayer存在如下缺点:

推荐阅读