音頻開發(fā)ijkplayer小結 android

最近接觸到一些音頻開發(fā)的操作和一個音頻開發(fā)的三方庫:
github:https://github.com/Bilibili/ijkplayer虑稼。
有人會問為什么使用三方庫:最直接原因當然是因為系統(tǒng)的MediaPlayer支持格式不多或者是版本限制。具體只支持格式:
http://developer.android.com/intl/zh-cn/guide/appendix/media-formats.html
http://blog.csdn.net/ddna/article/details/5173481
而ijkplayer底層基于ffmpeg,這個是個超強大的庫喧半。這里據(jù)說一些視頻直播方案就是采用的該播放器箕速。

1. Gradle導入

# required
allprojects {
    repositories {
        jcenter()
    }
}

dependencies {
    # required, enough for most devices.
    compile 'tv.danmaku.ijk.media:ijkplayer-java:0.5.0'
    compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.5.0'

    # Other ABIs: optional
    compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.5.0'
    compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.5.0'
    compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.5.0'
    compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.5.0'

    # ExoPlayer as IMediaPlayer: optional, experimental
    compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.5.0'
}

2. ijkplayer支持的操作:

首先可參見:MediaPlayer的文檔
http://developer.android.com/reference/android/media/MediaPlayer.html

1. 目前支持MediaPlayer的基本操作且參數(shù)一致如:

public native boolean isPlaying(); 
public native void seekTo(long msec) throws IllegalStateException;
public native long getCurrentPosition();
public native long getDuration();
public void pause() throws IllegalStateException 
public void prepareAsync() throws IllegalStateException
public void start() throws IllegalStateException

這些方法位于IjkMediaPlayer類中零截,最終實現(xiàn)是由jni調用底層c++代碼锭汛。當然還有些高級用法,這里給大家同時挖個坑管呵,因為我也只使用了基本的功能梳毙。

2. 小坑:

MediaPlayer的isPlaying條件 : (1)playing 正在播放
ijkplayer的isPlaying 方法返回為true條件是: (1)prepare or (2)playing 正在播放
下面是c++源碼:

 if (mp->mp_state == MP_STATE_PREPARED ||
        mp->mp_state == MP_STATE_STARTED) {
        return true;
    }   

3. CallBack 回調接口也是基本一致的。

interface OnPreparedListener {
        void onPrepared(IMediaPlayer mp);
    }

    interface OnCompletionListener {
        void onCompletion(IMediaPlayer mp);
    }

    interface OnBufferingUpdateListener {
        void onBufferingUpdate(IMediaPlayer mp, int percent);
    }

    interface OnSeekCompleteListener {
        void onSeekComplete(IMediaPlayer mp);
    }

    interface OnVideoSizeChangedListener {
        void onVideoSizeChanged(IMediaPlayer mp, int width, int height,
                                int sar_num, int sar_den);
    }

    interface OnErrorListener {
        boolean onError(IMediaPlayer mp, int what, int extra);
    }

    interface OnInfoListener {
        boolean onInfo(IMediaPlayer mp, int what, int extra);
    }

3. 特殊需求捐下,這個與player無關账锹。

1. 耳機插拔監(jiān)聽,比如耳機拔掉時關閉播放器坷襟〖榧恚可參考:

http://blog.csdn.net/thl789/article/details/7423523

2. 切換音頻源或播放其他資源時暫停等需求。

具體是實現(xiàn)AudioManager.OnAudioFocusChangeListener接口方法:
public void onAudioFocusChange(int focusChange)
繼續(xù)偷下懶婴程,就不在重復寫了廓奕。細節(jié)問題需要給位看官根據(jù)實際情形做決定:
http://www.reibang.com/p/32a67329307e

4 最近遇到的一個大坑:ANR

哎,沒遇到ANR Android程序猿的人生是不完整的排抬,最近使用0.4.5版時懂从,由于產(chǎn)品需要切換播放源授段,如果快速切換蹲蒲,就會造成ANR,主要原因是由于侵贵,切換是釋放資源我調用了其reset()届搁,該方法在主線程釋放資源超時。目前我看官方issue的建議是,重新new 一個ijkMeadiaPlayer卡睦,不調用reset宴胧,只調用release()方法。也有人提到使用在線程中reset表锻。 我的一個workaround是延遲執(zhí)行操作恕齐。

ps 另外一坑。

 說起來也不算是坑瞬逊,ijkplayer不支持開播未prepared時显歧,seek進度。(據(jù)說是與ffmpeg有關确镊,不覺明歷)士骤。 讓且換播放源,同時能快進蕾域。

(1)看issue的一種workaroud是 延遲seek(主要說是由于seek的時機是在onPrepared以后)
(2)我的處理方式當然是在onPrepared以后再seek進度拷肌。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市旨巷,隨后出現(xiàn)的幾起案子巨缘,更是在濱河造成了極大的恐慌,老刑警劉巖采呐,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件带猴,死亡現(xiàn)場離奇詭異,居然都是意外死亡懈万,警方通過查閱死者的電腦和手機拴清,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來会通,“玉大人口予,你說我怎么就攤上這事√槌蓿” “怎么了沪停?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長裳涛。 經(jīng)常有香客問我木张,道長,這世上最難降的妖魔是什么端三? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任舷礼,我火速辦了婚禮,結果婚禮上郊闯,老公的妹妹穿的比我還像新娘妻献。我一直安慰自己蛛株,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布育拨。 她就那樣靜靜地躺著谨履,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熬丧。 梳的紋絲不亂的頭發(fā)上笋粟,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音析蝴,去河邊找鬼矗钟。 笑死,一個胖子當著我的面吹牛嫌变,可吹牛的內容都是我干的吨艇。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼腾啥,長吁一口氣:“原來是場噩夢啊……” “哼东涡!你這毒婦竟也來了?” 一聲冷哼從身側響起倘待,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤疮跑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后凸舵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祖娘,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年啊奄,在試婚紗的時候發(fā)現(xiàn)自己被綠了渐苏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡菇夸,死狀恐怖琼富,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情庄新,我是刑警寧澤鞠眉,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站择诈,受9級特大地震影響械蹋,放射性物質發(fā)生泄漏。R本人自食惡果不足惜羞芍,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一哗戈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涩金,春花似錦谱醇、人聲如沸暇仲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至全度,卻和暖如春煮剧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背将鸵。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工勉盅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人顶掉。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓草娜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親痒筒。 傳聞我的和親對象是個殘疾皇子宰闰,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容