網站首頁 編程語言 正文
MediaPlayer
Android
多媒體框架支持播放提供了MediaPlayer
API,可以通過MediaPlayer
來實現媒體文件播放。可以說MediaPlayer
是非常方便使用的多媒體播放器,只需要簡單設置就能實現對音頻和視頻播放功能,其內部幫助開發者實現了播放對象獲取解碼以及播放功能。
簡單使用
MediaPlayer
支持多種資源形式:本地資源、內部URI、外部網址。
//播放器實例化 mediaPlayer = new MediaPlayer(); //準備播放素材 Uri uri = Uri.fromFile(new File("sdcard/DCIM","Camera/test.mp4")); try { //播放器載入資源 mediaPlayer.setDataSource(this,uri); } catch (IOException e) { e.printStackTrace(); } //播放器異步準備 mediaPlayer.prepareAsync(); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { //播放操作 mediaPlayer.start(); } }); //播放窗口展示 SurfaceView surfaceView = new SurfaceView(this); surfaceView.post(new Runnable() { @Override public void run() { mediaPlayer.setSurface(surfaceView.getHolder().getSurface()); } });
以上代碼示例就是MediaPlayer
簡單使用過程。其中prepareAsync()
是異步操作需要在回調setOnPreparedListener
方法了解最終播放器準備結果然后再執行播放操作。當然播放器也支持同步準備prepare
方法,但推薦使用異步操作,因為資源獲取過程可能會涉及到解碼數據會是耗時操作,同步操作很有可能造成ANR錯誤。
缺陷
MediaPlayer
雖然有內部狀態,某些操作只有在特定狀態下正確操作才能生效。若在非指定狀態下操作或許會導致播放器發生異常更有可能發生崩潰的情況。但播放器的內部狀態機并沒有暴露接口給開發者,無法隨時能夠獲取到目前播放器當前狀態。
AndroidMediaPlayer播放器封裝
因為缺陷原因直接使用MediaPlayer
就不能很好的去管理狀態。因此可以自行對MediaPlayer
進行封裝使用,可以將功能進行整理并且增加狀態管理和方便錯誤統一處理等邏輯。
狀態機編寫
根據MediaPlayer
狀態圖預設幾種狀態類型以暫存播放器內部狀態。
private static final int IDLE = 0; // 空閑狀態 private static final int INIT = 3;// 初始化狀態 private static final int PREPARING = 4;// 準備狀態 private static final int PREPARED = 5;// 準備狀態 private static final int STARTED = 6;// 開始狀態 private static final int PAUSED = 7;// 暫停狀態 private static final int STOPPED = 8;// 停止狀態 private static final int END = 9; // 結束狀態 private static final int ERROR = 10;// 錯誤狀態
內部類
使用mPlayerStatus
暫存播放器狀態
@IntDef({IDLE, END, ERROR, INIT, PREPARED, STARTED, PAUSED, STOPPED, }) public @interface STATUS { } MediaPlayer mMediaPlayer; Context mContext; @STATUS int mPlayerStatus = IDLE;
初始化函數
初始化函數實例化播放器并注冊基本播放所需要的回調函數
public AndroidMediaPlayer(Context context) { mContext = context; mMediaPlayer = new MediaPlayer(); mMediaPlayer.setOnErrorListener(this); mMediaPlayer.setOnCompletionListener(this); mMediaPlayer.setOnPreparedListener(this); mPlayerStatus = INIT; }
方法和回調
封裝播放器基礎方法可供播放調用并且進行狀態機判斷,若不在可操作范圍內則不可執行對應操作。同時對于資源設置方法通過原生api
可以看到有許多在形式,但這里就只是用URI
來做入參了。
//資源入參 public void setSource(Uri uri){ try { mMediaPlayer.setDataSource(mContext,uri); mMediaPlayer.prepareAsync(); mPlayerStatus = PREPARING; } catch (IOException e) { e.printStackTrace(); } } // 設置可視化窗口 public void setSurface(Surface surface){ mMediaPlayer.setSurface(surface); } //開始播放 public void start(){ mMediaPlayer.start(); mPlayerStatus = STARTED; } //暫停 public void pause(){ if(mPlayerStatus > PAUSED) return; mMediaPlayer.pause(); mPlayerStatus = PAUSED; } //停止 public void stop(){ if(mPlayerStatus > STOPPED) return; mMediaPlayer.stop(); mPlayerStatus = STOPPED; } //釋放 public void release(){ if(mPlayerStatus >= INIT){ mMediaPlayer.release(); mMediaPlayer = null; mPlayerStatus = END; } } // 錯誤回調 @Override public boolean onError(MediaPlayer mp, int what, int extra) { mPlayerStatus = ERROR; return false; } // 播放回調 @Override public void onCompletion(MediaPlayer mp) { } // 準備成功回調 @Override public void onPrepared(MediaPlayer mp) { mPlayerStatus = PREPARED; }
小結
MediaPlayer
作為官方提供封裝的播放器在使用上并沒有什么難度,可以說開發者直接開箱即用。或許對于簡單開發視頻播放已經足夠了,能夠播放本地文件或是網絡文件等都能支持。但對于深入理解MediaPlayer
可能還遠遠不夠,后續去讀讀源碼來了解內部實現。之后要自行實現編解碼來播放音視頻等能力去處理和添加其他效果的時候,那時MediaPlayer
或許就捉襟見肘了。
原文鏈接:https://juejin.cn/post/7083140590636007460
相關推薦
- 2022-07-11 pandas的排序、分組groupby及cumsum累計求和方式_python
- 2022-08-15 Elasticsearch文檔查詢詳解
- 2023-05-12 oracle刪除數據但表空間占用率沒有減小的情況_oracle
- 2022-10-25 maven方式創建spring項目-eclipse篇
- 2022-09-18 Python動態配置管理Dynaconf的實現示例詳解_python
- 2022-04-20 Flutter如何輕松實現動態更新ListView淺析_Android
- 2022-05-27 TensorFlow和Numpy矩陣操作中axis理解及axis=-1的解釋_python
- 2022-01-06 react實現todolist的增刪改查
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支