1. 程式人生 > >FFmpeg音訊播放庫:wlmusic

FFmpeg音訊播放庫:wlmusic

wlmusic v1.2.6(討論群:806397913)

基於FFmpeg + OpenSL ES的音訊播放SDK。可迴圈不間斷播放短音訊;播放raw和assets音訊檔案;可獨立設定音量大小;可實時現在音量分貝大小(用於繪製波形圖);可改變音訊播放速度和音調(變速不變調、變調不變速、變速又變調);可設定播放聲道(左聲道、右聲道和立體聲);可邊播邊錄留住美好音樂;可裁剪指定時間段的音訊,製作自己的彩鈴;還可以從中獲取音訊原始PCM資料(可指定取樣率),方便二次開發等。

8小時持續播放記憶體使用情況

image

CPU和記憶體使用情況:測試裝置:紅米2A手機

image image

Update v1.2.6 修復連續快速切換URL崩潰問題

Usage:(如果您的APP使用了本庫,可以告訴我下哦^_^)

Gradle: Download

implementation 'ywl.ywl5320:libmusic:1.2.6'

Maven:

<dependency>
  <groupId>ywl.ywl5320</groupId>
  <artifactId>libmusic</artifactId>
  <version>1.2.6</version>
  <type>pom</type>
</dependency>

配置NDK編譯平臺:

defaultConfig {
	...
	ndk {
	    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.setConvertSampleRate(SampleRateEnum.RATE_44100);//設定恆定取樣率(null為取消)
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中演示程式碼

12、設定輸出取樣率

wlMusic.setConvertSampleRate(SampleRateEnum.RATE_44100);

一、效果圖(對應設定啟動頁:MainActivity(例項演示) 或者 SplashActivity(廣播列表播放例項)或者 CutAudioActivity(音訊裁剪演示))

image
image
image
image

二、功能特色:

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

29、新增對https流媒體的支援 -->v1.2.2

30、新增恆定取樣率設定 -->v1.2.4

31、修復開啟URL失敗崩潰問題 -->v1.2.5

32、修復連續快速切換URL崩潰問題 -->v1.2.6

......

三、API(v1.2.6)

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) //裁剪時預覽播放

public void setConvertSampleRate(SampleRateEnum sampleRateEnum) //設定輸出PCM取樣率

四、環境

1、Android Studio 3.2.1

2、Android 4.1+

3、《中國網路廣播》api資料

create By ywl5320