1. 程式人生 > >Android視訊播放器Exoplayer自定義

Android視訊播放器Exoplayer自定義

一.背景

最近要用播放器播放視訊,以前沒怎麼做過,但是聽說過很多款第三方播放器,Android系統是沒有播放器,以前寫過一個用surfaceview寫的簡易播放器,但是離商用還有很遠的路,所以經過一番研究,我還是決定用谷歌的Exoplayer,至於原因請看下面

1.vitamio

官網地址:https://www.vitamio.org/

據說挺好用,但是要錢的,所以商用不行,貌似還不少,所以放棄

2.ijk

github地址:https://github.com/Bilibili/ijkplayer

B站的播放器

星星有10000多,應該挺好用,但是下面的商業許可權太多,不知道能不能用,原因還有就是demo沒跑起來吐舌頭

3.jiecao

github地址:https://github.com/lipangit/JieCaoVideoPlayer

星星快3000,簡單易用,傻瓜式的,但是封裝的太死,而且裡面有些東西封裝的不合理,貌似是基於ijk(以前)和Exoplayer(現在是)

4.exoplayer

github地址:https://github.com/google/ExoPlayer

專案中我用了這個,1.不要錢  2.裡面提到了相容性好,不用自己做 3.就是擴充套件性相對來說比較好,支援大部分音視訊播放


二.怎麼使用

(1).基本使用官網講的很清楚,這裡我就不贅述了

(2)開始講講自定義的過程吧,很簡單的(開始我也以為很複雜,其實並不難)

這裡我講的版本是R.2.1.0

在這個自定義我做了

1.音量調節(seekbar,如何調節在我其他文章有,去看音量調節)

2.明暗度調節(用了seekbar,如何調節在我其他文章有,看我怎麼做

3.載入縮圖(需要自身後臺介面支援)

4.圖示的一些替換

5.橫豎屏自適應(類似優酷,愛奇藝,看我怎麼做

6.還有一些細節的調整

SimpleExoplayerView.java

if (attrs != null) {
      TypedArray a = context.getTheme().obtainStyledAttributes(attrs,
          R.styleable.SimpleExoPlayerView, 0, 0);
      try {
        playerLayoutId = a.getResourceId(R.styleable.SimpleExoPlayerView_player_layout_id,
            playerLayoutId);
        useArtwork = a.getBoolean(R.styleable.SimpleExoPlayerView_use_artwork, useArtwork);
        useController = a.getBoolean(R.styleable.SimpleExoPlayerView_use_controller, useController);
        surfaceType = a.getInt(R.styleable.SimpleExoPlayerView_surface_type, surfaceType);
        resizeMode = a.getInt(R.styleable.SimpleExoPlayerView_resize_mode, resizeMode);
        controllerShowTimeoutMs = a.getInt(R.styleable.SimpleExoPlayerView_show_timeout,
            controllerShowTimeoutMs);
      } finally {
        a.recycle();
      }

PlayerbackControlVIew.java
 int controllerLayoutId = R.layout.exo_playback_control_view;
    rewindMs = DEFAULT_REWIND_MS;
    fastForwardMs = DEFAULT_FAST_FORWARD_MS;
    showTimeoutMs = DEFAULT_SHOW_TIMEOUT_MS;
    if (attrs != null) {
      TypedArray a = context.getTheme().obtainStyledAttributes(attrs,
          R.styleable.PlaybackControlView, 0, 0);
      try {
        rewindMs = a.getInt(R.styleable.PlaybackControlView_rewind_increment, rewindMs);
        fastForwardMs = a.getInt(R.styleable.PlaybackControlView_fastforward_increment,
            fastForwardMs);
        showTimeoutMs = a.getInt(R.styleable.PlaybackControlView_show_timeout, showTimeoutMs);
        controllerLayoutId = a.getResourceId(R.styleable.PlaybackControlView_controller_layout_id,
            controllerLayoutId);
      } finally {
        a.recycle();
      }


可以看出  這兩個關鍵的東西,佈局都是是可以直接替換的,而且裡面的一些屬性可以設定(個人覺得一些開源東西現在只能看原始碼才能知道怎麼用,文件現在很少了),所以如果你要定義自己東西就直接改佈局就行了,然後結合一些監聽就可以了。

最後是不是覺得寫得很少?

我也覺得有點少,但是我也不知道寫些啥,api的用法都在原始碼的那個Demo裡,一看就明白,改吧改吧就能用了。 PS:多看原始碼早成大牛大笑