為了模擬實(shí)現(xiàn)Android MediaPlayer的實(shí)現(xiàn),需要先了解下MediaPlayer的簡(jiǎn)單使用方法, 這里只列舉其中一種使用方式, 以這個(gè)為模板利用ffmpeg實(shí)現(xiàn)對(duì)應(yīng)的同名接口和調(diào)用方法.
MediaPlayer狀態(tài)
首先還是貼一下Android MediaPlayer 的狀態(tài)轉(zhuǎn)換圖.因?yàn)樗薪涌诘脑O(shè)計(jì)和調(diào)用方法會(huì)以這個(gè)狀態(tài)轉(zhuǎn)換圖為依據(jù), 理解狀態(tài)圖也能更好地理解播放器
其實(shí)理解Android MediaPlayer最直接的方法是看google的官方文檔
https://developer.android.google.cn/reference/android/media/MediaPlayer
因?yàn)橐呀?jīng)有大量的文章轉(zhuǎn)載和翻譯,所以這里暫時(shí)不做介紹和翻譯,可能會(huì)在后續(xù)實(shí)現(xiàn)接口的過程中引用和參考里面的內(nèi)容
MediaPlayer簡(jiǎn)單實(shí)現(xiàn)
如何實(shí)現(xiàn)一個(gè)demo網(wǎng)上有很多的資料,這里不再詳細(xì)說明,只是畫一下demo的簡(jiǎn)單實(shí)現(xiàn)步驟, 后面的Android FFmpeg專題結(jié)構(gòu)會(huì)用這個(gè)流程來實(shí)現(xiàn)播放器對(duì)應(yīng)的接口网梢。
demo地址
https://github.com/yizhongliu/blog/tree/main/code/MediaPlayerDemo
其中1和2 步驟可以調(diào)換,需要實(shí)現(xiàn)以下的接口
public MediaPlayer()
public void setDisplay(SurfaceHolder sh)
public void setDataSource(String path)
throws IOException, IllegalArgumentException, SecurityException, IllegalStateException
public native void prepareAsync() throws IllegalStateException;
public void start() throws IllegalStateException
public interface OnPreparedListener
public void setOnPreparedListener(OnPreparedListener listener)
public interface OnErrorListener
public void setOnErrorListener(OnErrorListener listener)
public interface OnCompletionListener
public void setOnCompletionListener(OnCompletionListener listener)
后面會(huì)先根據(jù)以上的函數(shù)和調(diào)用流程,先搭建一個(gè)player框架以及對(duì)MediaPlayer以上接口流程進(jìn)行詳細(xì)分析