Coder Social home page Coder Social logo

wanliyang1990 / wlmusic Goto Github PK

View Code? Open in Web Editor NEW
589.0 24.0 128.0 90.64 MB

基于FFmpeg + OpenSL ES的音频播放SDK。可循环不间断播放短音频;播放raw和assets音频文件;可独立设置音量大小;可实时现在音量分贝大小(用于绘制波形图);可改变音频播放速度和音调(变速不变调、变调不变速、变速又变调);可设置播放声道(左声道、右声道和立体声);可边播边录留住美好音乐;可裁剪指定时间段的音频,制作自己的彩铃;还可以从中获取音频原始PCM数据(可指定采样率),方便二次开发等。

Java 100.00%

wlmusic's Introduction

wlmusic v1.2.6(讨论群:806397913)

基于FFmpeg + OpenSL ES的音频播放SDK。可循环不间断播放短音频;播放raw和assets音频文件;可独立设置音量大小;可实时现在音量分贝大小(用于绘制波形图);可改变音频播放速度和音调(变速不变调、变调不变速、变速又变调);可设置播放声道(左声道、右声道和立体声);可边播边录留住美好音乐;可裁剪指定时间段的音频,制作自己的彩铃;还可以从中获取音频原始PCM数据(可指定采样率),方便二次开发等。

百度网盘链接: https://pan.baidu.com/s/1mvIflaxujEoufLrnyNNxRQ 提取码: mkki

****** 体验视频(包含单独播放音频,已优化了变速变调效果)播放库 ******

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

wlmusic's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wlmusic's Issues

播放本地音频出错了

image

文件放在assets目录了,

  String url = RawAssetsUtil.getAssetsFilePath(this, "test.mp3");
        wlMusic.setSource(url);
        wlMusic.prePared();

setOnErrorListener 没有日志输出

onComplete()回调问题

当前音频播放完毕后调用playNext(url) 播放失败
报错信息为 code : 1001 msg : can not open url
在complete后调用playNext是否需要调用其他前置方法,或者重新构造一个WlMusic实例?

java.lang.UnsatisfiedLinkError

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.gl.opengles_demo-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.gl.opengles_demo-2/lib/arm64, /data/app/com.example.gl.opengles_demo-2/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]] couldn't find "libavutil-55.so"

请问可以设置固定采样率进行播放吗?

请教大神一个问题:

在我进行音乐文件播放的时候可以设置固定采样率进行播放吗,er不是以音频原文件的采样率进行播放。
因为我需要将音频作为背景音乐进行录音,在混音(麦克风和背景音乐混合)的时候,希望在获取音频播放的pcm数据是和录音的采样率保持一致?
对音频这块还不是很了解,不知道我这种做法是不是正确的。

谢谢

播放完成回调

这边播放完成回调中判断是否已经完成播放,WlMusic.getInstance().isPlaying()返回true,建议在onCallComplete的方法中将stop方法优先执行

audiotrack 可以设置 streamType

public AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat,
            int bufferSizeInBytes, int mode, int sessionId)

opensl好像不能设置streamtype,有办法吗

循环播放没有声音

1.setOnErrorListener没有回调
2.声音文件为15s左右的mp3
3.关掉循环播放,就正常了

另外需要一个 mediaPlayer.isPlaying()这样判断是否在播放的方法。麻烦了

混淆规则

如题,这个类库有什么是不能混淆的么?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.