Android高度封裝的MediaPlayer,一行代碼實現(xiàn)音視頻的播放

HDMediaPlayer

該類包依托于谷歌Mediaplayer二次封裝,一行代碼就可以實現(xiàn)播放的邏輯。
谷歌中國API鏈接: Google官網(wǎng)API

演示動畫

Github地址

https://github.com/yinhaide/HDMediaPlayer

特性

  • 該類支持播放格式有:音樂(.mp3、.wav、.ogg)、視頻(.mp4、.3gp)

  • 支持播放本地音頻、視頻

  • 支持播放Assets目錄下的音頻、視頻

  • 支持播放網(wǎng)絡(luò)網(wǎng)絡(luò)流媒體(僅限上述格式)

如何快速集成

導入方式

在工程級別的build.gradle添加

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

在應用級別的build.gradle添加

api 'com.github.yinhaide:HDMediaPlayer:0.0.5'

如何使用

  • 一行代碼實現(xiàn)播放Assets目錄下的mp4:
MediaPlayerHelper.getInstance().setSurfaceView(surfaceView).playAsset(context,"test.mp4");
  • 一行代碼實現(xiàn)播放Assets目錄下的mp3:
MediaPlayerHelper.getInstance().playAsset(context,"test.mp3");
  • 一行代碼實現(xiàn)播放網(wǎng)絡(luò)流媒體或者本地全路徑流媒體:
/**
 * urlString 可為網(wǎng)絡(luò)流媒體連接,也可以為本地存儲全路徑鏈接
 */
MediaPlayerHelper.getInstance().setSurfaceView(surfaceView).play(urlString);
  • 如果想得到詳細的回調(diào)信息:
MediaPlayerHelper.getInstance().setMediaPlayerHelperCallBack(new MediaPlayerHelper.MediaPlayerHelperCallBack() {
    @Override
    public void onCallBack(MediaPlayerHelper.CallBackState state, MediaPlayerHelper mediaPlayerHelper, Object... args) {
        Log.v(TAG,"--"+state.toString());
        if(state== MediaPlayerHelper.CallBackState.PROGRESS){
            int percent=(int)args[0];
            Log.v(TAG,"--progress:"+percent);
        }
    }
});
  • 更多的用法請查看demo:
/** 設(shè)置播放進度回調(diào)時間間隔 */
MediaPlayerHelper.getInstance().setProgressInterval(msec);
/** 獲得MediaPlayer對象,進行更多的自定義的操作 */
MediaPlayerHelper.getInstance().getMediaPlayer().pause();
MediaPlayerHelper.getInstance().getMediaPlayer().start();
MediaPlayerHelper.getInstance().getMediaPlayer().stop();

注意點

1、播放結(jié)束后到下次播放有黑屏現(xiàn)象

在部分配置比較低的電視或者手機設(shè)備中,視頻播放完畢到下次播放之間可能存在1s左右的黑屏現(xiàn)象,原因是部分機器軟解嗎能力較弱,需要將數(shù)據(jù)解碼放在內(nèi)存當中導致黑屏。解決方案是開啟手機的硬件加速能力,讓硬件協(xié)助解碼,消除黑屏現(xiàn)象。

<application
    android:hardwareAccelerated="true"
    ...
</application>

2、部分機型/電視存在黑屏有聲音的現(xiàn)象

在部分機型中,會有播放沒畫面的,原因是因為SurfaceHolder可能在創(chuàng)建的時候尺寸不對,需要動態(tài)賦值。這個操作必須在主線程中進行。

@Override
public void surfaceCreated(SurfaceHolder holder) {
    ...
    if(holder != null && uiHolder.surfaceView != null){
        uiHolder.surfaceView.post(() -> holder.setFixedSize(uiHolder.surfaceView.getWidth(),uiHolder.surfaceView.getHeight()));
    }
    ...
}

這個項目會持續(xù)更新中...

都看到這里了,如果覺得寫的可以或者對你有幫助的話,順手給個星星點下Star~

這個控件內(nèi)部采用一個Fragment框架,如果有興趣的話可以去了解一下

關(guān)于我

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容