All Projects → qssq → musicplayer

qssq / musicplayer

Licence: other
musicplayer 音乐播放器框架 简单易懂易扩展 已写了播放器demo和列表播放的demo兼容七牛等第三方Mediaplayer

Programming Languages

java
68154 projects - #9 most used programming language

Projects that are alternatives of or similar to musicplayer

Refresh-Music-Player
A beautifully designed music player app for android.
Stars: ✭ 22 (+57.14%)
Mutual labels:  music-player, musicplayer
MusicPlayer
Play songs in Background with a set of user preferences available as a 'switch' in the cmdlet.
Stars: ✭ 16 (+14.29%)
Mutual labels:  music-player, mediaplayer
Qt5-MusicPlayer
基于Qt5开发的一个小巧精美的本地音乐播放器。代码注释详细,适合作为一个用于入门的Qt5实战项目。
Stars: ✭ 136 (+871.43%)
Mutual labels:  music-player, musicplayer
Jetpack Musicplayer
即使不用云音乐听曲儿,也请务必收藏好该库!🔥 一行代码即可接入,音乐播放控制组件 - Even if you don't listen to the music by Spotify, be sure to collect this library, please! 🔥 This music player component can be accessed by only one line of code. Supporting by LiveData & AndroidX.
Stars: ✭ 577 (+4021.43%)
Mutual labels:  music-player, musicplayer
Starrysky
🔥A Powerful and Streamline MusicLibrary(一个丰富的音乐播放封装库,支持多种音频格式,完美解决你的问题。)
Stars: ✭ 1,022 (+7200%)
Mutual labels:  music-player, musicplayer
Guayadeque
Guayadeque is a music management program designed for all music enthusiasts. It is Full Featured Linux media player that can easily manage large collections and uses the Gstreamer media framework.
Stars: ✭ 87 (+521.43%)
Mutual labels:  music-player, mediaplayer
Musicbox
😊 🎵 MusicPlayer 一站式收听多平台音乐(网易云, 虾米, QQ)的跨平台音乐播放器,尽情享受吧~✨
Stars: ✭ 1,130 (+7971.43%)
Mutual labels:  music-player, musicplayer
MusicPlayer
A Telegram Music Bot written in Python using Pyrogram and Py-Tgcalls. This is Also The Source Code of The UserBot Which is Playing Music in @S1-BOTS Support Group ❤️
Stars: ✭ 218 (+1457.14%)
Mutual labels:  music-player, musicplayer
SocyMusic
SocyMusic is an open-source Android music player written in Java with the aim of creating an easy-to-use app for exchanging and listening to top-quality music. Help us create it!
Stars: ✭ 22 (+57.14%)
Mutual labels:  music-player
muser
Muser: A powerful Discord music bot made in DJs v13 managed by PGamerX, Peiprjs, and Luckie.
Stars: ✭ 66 (+371.43%)
Mutual labels:  music-player
SourceRadio
Stream music from YouTube while playing games on Steam
Stars: ✭ 10 (-28.57%)
Mutual labels:  music-player
muCLIar
YouTube automator bringing you your music right on your CLI.
Stars: ✭ 119 (+750%)
Mutual labels:  musicplayer
Maple
Maple is a windows desktop application designed to support semi and non professional streamers in playing back local audio files and streaming content from the internet to their favorite playback device
Stars: ✭ 37 (+164.29%)
Mutual labels:  mediaplayer
vcplayerbot
Play songs directly in telegram voice chats.
Stars: ✭ 48 (+242.86%)
Mutual labels:  music-player
Jericho-Player
LightWeight Framework for discord.js v13 Music Bots and Radio Bots with fast moderation with commands and no memory leak.
Stars: ✭ 19 (+35.71%)
Mutual labels:  music-player
sbotify
your personal bot that plays spotify music
Stars: ✭ 25 (+78.57%)
Mutual labels:  music-player
musicont
React Native & Expo music player application UI
Stars: ✭ 72 (+414.29%)
Mutual labels:  music-player
react-native-track-player
A fully fledged audio module created for music apps. Provides audio playback, external media controls, chromecast support, background mode and more!
Stars: ✭ 2,348 (+16671.43%)
Mutual labels:  music-player
MusicUnionSearch
音乐全网搜索
Stars: ✭ 20 (+42.86%)
Mutual labels:  music-player
violin
🎵 Minimalistic music player for desktop devices.
Stars: ✭ 40 (+185.71%)
Mutual labels:  music-player

图片演示

演示图片地址1 演示图片地址2 演示图片地址3 演示图片地址4

模块功能介绍

模块无任何ui代码,只是一个播放器后台框架而已,是一个基于 service binder 作为控制台 +观察者模式提供回调的的音乐播放器

demo项目则演示了多个列表 多个界面的控制播放暂停 能力 ui列表展示的能力, 另外为了方便使用提供了一个工具类 帮助快速的绑定和接触binder绑定

是否可靠

我的公司项目app正常使用中,复杂程度和类似正常的音乐app,目前功能比百度音乐人还复杂,多了各种语音 视频 动态 列表,各种fragment 嵌套多个,多个fragment中的列表播放控制和解绑。点击这边的fragment又要控制另外的 fragment列表的状态变成暂停, 所以说,这app绝对不是因为demo而出现,而是先有项目后有demo

扩展性

兼容第三方MediaPlayer ,系统的播放器MediaPlayer已经适配好了```SystemMediaPlayerProxyImpl`` 七牛PLMediaPlayer的代码我会在本文档最后么给出.各位根据模仿着改就ok的哈!

使用方法

gradle

 compile 'cn.qssq666:musicplayer:0.2'


maven

<dependency>
  <groupId>cn.qssq666</groupId>
  <artifactId>musicplayer</artifactId>
  <version>0.1</version>
  <type>pom</type>
</dependency>
视频地址

http://v.youku.com/v_show/id_XMjkyMTQ2MDAwOA==.html?spm=a2h3j.8428770.3416059.1

音乐列表后台播放器,支持各种播放模式,(顺序播放,循环播放,随机播放,单曲循环)使用观察者模式实现通知回调,使用bind的方法提供操作接口控制台 关于扩展性可靠性都是绝对可信的,我们公司开发的app我就为了隐私就不说了,但是我们公司的项目可以说比百度音乐人的还麻烦,各种音乐列表,各种音乐布局,还包括了列表进度监听等等,所以绝对不坑害大家,尽管使用哈! 另外还支持自动缓存 ,demo中已经写好了 如何使用缓存的方法,实际上就是CachePlayServiced的逻辑,只需要绑定此类就行了

另外本人没用任何的第三方库什么高级的Retrofit什么的,就用的观察者模式,实现多个控制台的通知,通熟易懂方便学习又能轻松应用用公司项目开发.

class MediaControlBinder extends Binder { 
   public boolean addMediaInfoCallBack(IMediaControlCallBack mediaInfoCallBack) {

        }

        public boolean removeMediaInfoCallBack(IMediaControlCallBack mediaInfoCallBack) {
        }
        /**
            设置控制台播放列表集合
        **/
        public void setMusicList(List<? extends MusicData> musicFileList) {
        }

        public List<? extends MusicData> getMusicList() {
        }

        public int getCurrentDuration() {
        }

        public boolean isCurrentControlList(MusicData musicData) {

        }

        public boolean isCurrentControlList(List<? extends MusicData> list) {

        }

        public boolean isPlaying() {
        }

        public int getPlayListPosition() {

        }

        public MusicData getCurrentModel(int position) {
        }

        public MusicData getCurrentModel() {
        }
 /**
         * 如果没有播放没有初始化 用来获取这个判断类型也是可以的
         *
         * @return
         */
        public MusicData getFirstModel() {
        }

        public int getDuration() {
        }

        public boolean pause() {
        }


        public boolean play(MusicData data) {
        }

        public boolean play(int position) {
        }

        public void replay(MusicData data) {
        }

        public void replay(MusicData data, int duration) {
        }

        public boolean playOrPause() {
        }

        public boolean playNext() {
        }

        public boolean playPre() {
        }

        public boolean continuePlay() {

        }

        public boolean seekTo(int rate) {
        }

        public boolean stop() {
        }

        public PLAYSTATE getPlayState() {
        }

        public void setPlayMode(PLAYMODE mode) {
        }

        public PLAYMODE getPlayMode() {
        }

        public boolean playPositionIsVolid() {
        }

        public boolean playPositionIsVolid(int position) {
}
}

demo封装了MusicServiceHelper代码 可以轻松在任意activity中使用

MusicServiceHelper主要代码


    private MusicServiceHelper(Context context, OnMusicChangeListener onMusicChangeListener, String musicStationName) {
        string = musicStationName;
        this.context = context;
        Intent intent = null;
        intent = new Intent(context, PlayService.class);
        context.bindService(intent, mPlayconn, Service.BIND_AUTO_CREATE);
        this.onMusicChangeListener = onMusicChangeListener;


    }


    public void destory() {

        if (mPlayconn != null) {
            context.unbindService(mPlayconn);
        }
        if (mMediaControlCallBack != null && mPlaybinder != null) {
            mPlaybinder.removeMediaInfoCallBack(mMediaControlCallBack);
        }
    }


  private ServiceConnection mPlayconn = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            if (service instanceof PlayService.MediaControlBinder) {
                mPlaybinder = ((PlayService.MediaControlBinder) service);
                mPlaybinder.addMediaInfoCallBack(mMediaControlCallBack);
                if (onMusicHelperBaceListener != null) {
                    onMusicHelperBaceListener.onBindService();
                }
            }

        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
     
     

MusicServiceHelper是对绑定服务和添加监听的封装,各位不懂服务的绑定用法完全可以看MusicServiceHelper怎么写的哈,或者直接拿来用简单的需求,MainActivity中只需要判断是否有歌单则我通常就直接用这个帮助类了 完全没必要写麻烦的添加监听方法了.

MusicServiceHelper 在activity或者fragment里面的用法

//onCreate中
  instance = MusicServiceHelper.getInstance(this, new MusicServiceHelper.OnMusicHelperBaceListener() {
            @Override
            public void onPause(MusicData data) {

            }

            @Override
            public void onPlayErr(String str, MusicData data) {

            }

            @Override
            public void onPlay(MusicData data) {

            }

            @Override
            public void onBindService() {

            }
        });
 //onDestory中
        instance.destory();


其他吐槽

demo已实现了离线缓存功能,轻松为服务器减压! 推荐做烧钱的大流量公司这么干,可以大大节省成本.

PLMediaPlayer实现方案

public class PLMediaPlayerImpl extends PLMediaPlayer implements IMediaPlayerProxy {

    private static final String TAG = "PLMediaPlayerImpl";

    public PLMediaPlayerImpl(Context context) {
        super(context);
    }

    public PLMediaPlayerImpl(Context context, AVOptions avOptions) {
        super(context, avOptions);
    }


    public PLMediaPlayerImpl getInstance() {
        return this;
    }




    @Override
    public void setOnBufferingUpdateListener(final IMediaPlayerProxy.OnBufferingUpdateListener listener) {
        super.setOnBufferingUpdateListener(new PLMediaPlayer.OnBufferingUpdateListener() {
            @Override
            public void onBufferingUpdate(PLMediaPlayer plMediaPlayer, int percent) {
                if (listener != null) {
                    listener.onBufferingUpdate(getInstance(), percent);
                }
            }
        });
    }

    @Override
    public void setOnErrorListener(final IMediaPlayerProxy.OnErrorListener listener) {
        super.setOnErrorListener(new PLMediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(PLMediaPlayer plMediaPlayer, int i) {
                if (listener == null) {
                    return false;
                } else {
                    return listener.onError(getInstance(), i, 0);

                }
            }
        });
    }

    @Override
    public void setOnPreparedListener(final IMediaPlayerProxy.OnPreparedListener listener) {
        super.setOnPreparedListener(new PLMediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(PLMediaPlayer plMediaPlayer, int i) {
                if (listener != null) {
                    listener.onPrepared(getInstance());
                }
            }
        });
    }

    @Override
    public void setOnCompletionListener(final IMediaPlayerProxy.OnCompletionListener listener) {

        super.setOnCompletionListener(new PLMediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(PLMediaPlayer mp) {

                if (listener != null) {
                    listener.onCompletion(getInstance());
                }
            }
        });
    }

    @Override
    public void setOnSeekCompleteListener(final IMediaPlayerProxy.OnSeekCompleteListener listener) {
        super.setOnSeekCompleteListener(new PLMediaPlayer.OnSeekCompleteListener() {
            @Override
            public void onSeekComplete(PLMediaPlayer plMediaPlayer) {
                if (listener != null) {
                    listener.onSeekComplete(getInstance());
                }
            }
        });
    }


    @Override
    public void setAudioStreamType(int streamMusic) {

    }

    @Override
    public void seekTo(int seekto) {

        Prt.w(TAG,"seekTo:"+seekto);
        super.seekTo(seekto);
    }


    @Override
    public void setDataSourceProxy(Context context, Uri parse) throws IOException {
        super.setDataSource(context, parse);
    }

    @Override
    public void setDataSourceProxy(String url) throws IOException {
        super.setDataSource(url);

    }

    @Override
    public long getCurrentPositionProxy() {
        return super.getCurrentPosition();
    }

    @Override
    public long getDurationProxy() {
        return super.getDuration();
    }

    @Override
    public void setSpeed(float playSpeed) {

    }

    @Override
    public float getSpeed() {
        return 0;
    }
}

七牛服务

public class LiveMusicService extends PlayService {

    @Override
    protected IMediaPlayerProxy onCreateMediaPlayer() {
        AVOptions options = new AVOptions();
        int isLiveStreaming = 0;
        // the unit of timeout is ms
        options.setInteger(AVOptions.KEY_PREPARE_TIMEOUT, 10 * 1000);
        options.setInteger(AVOptions.KEY_GET_AV_FRAME_TIMEOUT, 10 * 1000);
        // Some optimization with buffering mechanism when be set to 1
        options.setInteger(AVOptions.KEY_LIVE_STREAMING, isLiveStreaming);
        if (isLiveStreaming == 1) {
            options.setInteger(AVOptions.KEY_DELAY_OPTIMIZATION, 1);
        }
        // 1 -> hw codec enable, 0 -> disable [recommended]
//        int codec = getIntent().getIntExtra("mediaCodec", 0);
        options.setInteger(AVOptions.KEY_MEDIACODEC, 1);
        // whether start play automatically after prepared, default value is 1
        options.setInteger(AVOptions.KEY_START_ON_PREPARED, 0);

        return new PLMediaPlayerImpl(getApplicationContext(), options);
    }
}

如果是直播就把isLiveStreaming改成1

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].