wlmusic v1.2.0(討論羣:806397913)
基於FFmpeg + OpenSL ES的音頻播放SDK。可循環不間斷播放短音頻;播放raw和assets音頻文件;可獨立設置音量大小;可實時現在音量分貝大小(用於繪製波形圖);可改變音頻播放速度和音調(變速不變調、變調不變速、變速又變調);可設置播放聲道(左聲道、右聲道和立體聲);可邊播邊錄留住美好音樂;可裁剪指定時間段的音頻,製作自己的彩鈴;還可以從中獲取音頻原始PCM數據,方便二次開發等。
我的視頻課程(基礎):《(NDK)FFmpeg打造Android萬能音頻播放器》
我的視頻課程(進階):《(NDK)FFmpeg打造Android視頻播放器》
我的視頻課程(編碼直播推流):《Android視頻編碼和直播推流》
CPU和內存使用情況:測試設備:紅米2A手機
Update v1.2.0 重構音頻裁剪和PCM數據回調邏輯, 使調用更簡單。
Usage:
Gradle:
implementation 'ywl.ywl5320:libmusic:1.2.0'
Maven:
<dependency>
<groupId>ywl.ywl5320</groupId>
<artifactId>libmusic</artifactId>
<version>1.2.0</version>
<type>pom</type>
</dependency>
配置NDK編譯平臺:
defaultConfig {
...
ndk {
abiFilter("armeabi")
abiFilter("armeabi-v7a")
abiFilter("x86")
}
}
需要權限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
接入代碼:
1、播放一般音樂
WlMusic wlMusic = WlMusic.getInstance();
wlMusic.setSource("http://mpge.5nd.com/2015/2015-11-26/69708/1.mp3"); //設置音頻源
wlMusic.setCallBackPcmData(true);//是否返回音頻PCM數據
wlMusic.setShowPCMDB(true);//是否返回音頻分貝大小
wlMusic.setPlayCircle(true); //設置不間斷循環播放音頻
wlMusic.setVolume(65); //設置音量 65%
wlMusic.setPlaySpeed(1.0f); //設置播放速度 (1.0正常) 範圍:0.25---4.0f
wlMusic.setPlayPitch(1.0f); //設置播放速度 (1.0正常) 範圍:0.25---4.0f
wlMusic.setMute(MuteEnum.MUTE_CENTER); //設置立體聲(左聲道、右聲道和立體聲)
wlMusic.parpared();準備開始
wlMusic.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared() {
wlMusic.start(); //準備完成開始播放
}
});
//seek時間
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
position = wlMusic.getDuration() * progress / 100;
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
wlMusic.seek(position, false, false);// 表示在seeking中,此時不回調時間
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
wlMusic.seek(position, true, true);//表示seek已經完成,然後纔回調時間,避免自己控制時間邏輯和時間顯示不穩定問題。
}
});
2、循環不停頓播放短音頻(音頻不限時長)
wlMusic.setPlayCircle(true);
3、播放raw文件和assets文件
url = RawAssetsUtil.getAssetsFilePath(this, "goready.wav");
url = RawAssetsUtil.getRawFilePath(this, R.raw.readygo, "readygo.wav");
wlMusic.setSource(url);
4、設置速度1.5倍 (0.25~4.0f)
wlMusic.setPlaySpeed(1.5f);
5、設置音調1.5倍 (0.25~4.0f)
wlMusic.setPlayPitch(1.5f);
6、設置左聲道
wlMusic.setMute(MuteEnum.MUTE_LEFT);
7、開始錄製
wlMusic.startRecordPlaying(Environment.getExternalStorageDirectory().getAbsolutePath() + "/ywl5320/record", "myrecord");//生成的錄音文件爲:myrecord.aac
8、暫停錄製
wlMusic.pauseRecordPlaying();
9、恢復錄製
wlMusic.resumeRecordPlaying();
10、停止錄製
wlMusic.stopRecordPlaying();
11、裁剪音頻(對應可獲取總長度的音頻)
看CutAudioActivity中演示代碼
一、效果圖(對應設置啓動頁:MainActivity(實例演示) 或者 SplashActivity(廣播列表播放實例)或者 CutAudioActivity(音頻裁剪演示))
二、功能特色:
1、播放本地音頻或網絡音頻流媒體
2、播放狀態(準備、開始、暫停、停止、切換)
3、FFmpeg解碼,兼容幾乎所有類型的音頻文件
4、採用OpenSL ES直接底層播放
5、動態權限申請
6、迷你播放控制欄
7、Activity動畫
8、Activity、Dialog沉浸狀態欄
9、網絡接口返回數據再封裝
10、循環不間斷播放短音頻 ---> add v1.0.1
11、可設置音量大小 ---> add v1.0.2
12、播放raw和assets ---> add v1.0.2
13、聲音分貝大小回調用於繪製波形圖 ---> add v1.0.3
14、添加isPlaying()方法 ---> add v1.0.4
15、添加改變播放速率方法 ---> add v1.0.5
16、添加設置聲道方法 ---> add v1.0.5
17、添加設置音頻音調方法 ---> add v1.0.6
18、更新設置播放速度方法 ---> add v1.0.6
19、優化CPU使用率和內存使用率 ---> add v1.0.8
20、優化seek時平穩過度 ---> add v1.0.9
21、添加邊播邊錄功能 ---> add v1.1.0
22、增加音頻裁剪預覽播放功能 --> add v1.1.1
23、增加指定時間段音頻裁剪功能 --> add v1.1.1
24、增加原始音頻數據(PCM)暴露接口 --> add v1.1.2
25、增加裁剪播放時回調PCM數據 --> add v1.1.3
26、增加 armeabi-v7a 庫,並進行了none優化 -->add v1.1.4
27、修復.wav文件不能播放問題、增加快速切換變聲變調功能的穩定性 -->add v1.1.5
28、重構音頻裁剪和PCM數據回調邏輯, 使調用更簡單 -->add v1.2.0
......
三、API(v1.2.0)
public void setSource(String source) //設置音頻源
public void parpared() //準備播放
public void setOnPreparedListener(OnPreparedListener onPreparedListener) //準備成功回調
public void start() //開始播放
public void pause() //暫停播放
public void resume() //恢復播放(對應於暫停)
public void stop() //停止播放,回收資源
public boolean isPlaying(); //是否正在播放中
public void setPlayCircle(boolean playCircle)//設置是否循環播放短音頻
public void setPlayNext(boolean playNext) //設置播放下一個狀態(true:調用stop後會重新播放音頻源)
public void playNext(String source) //切換播放源
public void seek(final int secds, boolean seekingfinished, boolean showTime) //secds:時間(秒) seekingfinished:true表示在滑動中 false表示滑動停止並執行seek功能 showTime:是否回調時間
public void setVolume(int percent) //設置音量(0~100)
public int getDuration() //獲取時長
public void setPlaySpeed(int speed) //設置播放速度(默認正常速度 1.0 範圍:0.25x ~ 4.0x)
public void setPlayPitch(float pitch) //設置音頻音調(默認正常音調 1.0 範圍:0.25x ~ 4.0x)
public void setMute(MuteEnum mute) //設置播放聲道 (MuteEnum.MUTE_LEFT,MuteEnum.MUTE_RIGHT,MuteEnum.MUTE_CENTER)
public void startRecordPlaying(String recordSavePath, String recordSaveName) // 邊播邊錄 (recordSavePath:存儲目錄;recordSaveName:錄製文件名稱)
public void stopRecordPlaying() // 停止錄製
public void pauseRecordPlaying() //暫停錄製
public void resumeRecordPlaying() //恢復錄製
public void setOnErrorListener(OnErrorListener onErrorListener) //出錯回調
public void setOnLoadListener(OnLoadListener onLoadListener) //加載回調
public void setOnInfoListener(OnInfoListener onInfoListener) //進度信息回調
public void setOnCompleteListener(OnCompleteListener onCompleteListener) //播放完成回調
public void setOnPauseResumeListener(OnPauseResumeListener onPauseResumeListener) //暫停、恢復回調
public void setOnVolumeDBListener(OnVolumeDBListener onVolumeDBListener) //聲音分貝大小回調
public void setCallBackPcmData(boolean callBackPcmData) //全局設置是否把播放的PCM原始數據回調到應用層
public void setShowPCMDB(boolean showPCMDB) //設置是否回調音頻分貝數
public void cutAudio(int start_secs, int end_secs, String savepath, String filename) //開始裁剪 (參數:開始、結束時間(秒)、裁剪音頻保存目錄、裁剪音頻保存名稱)
public void cutAudio(int start_secs, int end_secs) //裁剪音頻 快速回調PCM數據到應用層(setCallBackPcmData爲true時纔有效)
public void playCutAudio(int start_secs, int end_secs) //裁剪時預覽播放
四、環境
1、Android Studio 3.+
2、Android 4.1+
3、《中國網絡廣播》api數據
create By ywl5320