手機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將可能導致 *** 音頻流的獲取出現錯誤 。因此為了保證功能的正常使用 , 我們必須阻止系統關閉服務 ??梢允褂脀ake locks(喚醒鎖) , 它會告訴系統你正在使用某些功能 , 這樣就可以一直保持該功能處于喚醒狀態 , 即使鎖屏無操作也能繼續使用 。這個鎖會在paused和stoped狀態下釋放 。1.1.2 SoundPool如果應用程序經常播放密集、急促而又短暫的音效(如游戲音效)那么使用MediaPlayer顯得有些不太適合了 。因為MediaPlayer存在如下缺點:

推薦閱讀