Android ExoPlayer实现网络URL、本地视频播放

Android ExoPlayer播放器使用

转载请标明出处:http://blog.csdn.net/zhijunhong/article/details/51056302 谢谢!~

项目需要播放网络url视频,搜索后发现google官方有提供ExoPlayer播放器,实现后发现基本可满足需求(附源码)。现将代码分享如下:

  • 播放器视图xml文件
  • 资源文件初始化
  • 初始化播放器设置
  • 关闭并释放播放器资源
  • 播放异常处理

播放器视图xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <com.google.android.exoplayer2.ui.SimpleExoPlayerView
        android:id="@+id/simpleExoPlayerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

资源文件初始化

 @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_exoplaye);
        mSimpleExoPlayerView = (SimpleExoPlayerView) findViewById(R.id.simpleExoPlayerView);
        mainHandler = new Handler();
        mShouldAutoPlay = true;
        clearResumePosition();
        if (CookieHandler.getDefault() != DEFAULT_COOKIE_MANAGER) {
            CookieHandler.setDefault(DEFAULT_COOKIE_MANAGER);
        }
        mSimpleExoPlayerView.requestFocus();
    }

初始化播放器设置

 /**
     * 初始化播放器
     */
    private void initializePlayer() {
        boolean needNewPlayer = player == null;
        if (needNewPlayer) {
            TrackSelection.Factory adaptiveTrackSelectionFactory = new AdaptiveTrackSelection.Factory(BANDWIDTH_METER);
            trackSelector = new DefaultTrackSelector(adaptiveTrackSelectionFactory);
            player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
            player.addListener(this);
            mSimpleExoPlayerView.setPlayer(player);
            //设置自动播放
            player.setPlayWhenReady(mShouldAutoPlay);

            DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this,
                    Util.getUserAgent(this, "Multimedia"));
            ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
            //TODO...更换*.mp4文件地址
MediaSource videoSource = new ExtractorMediaSource(Uri.parse("http://xxxxxx.xxxxxx.mp4"), dataSourceFactory, extractorsFactory, mainHandler,
                    new ExtractorMediaSource.EventListener() {
                        @Override
                        public void onLoadError(IOException error) {
                            Log.e(TAG, "onLoadError: " + error.getMessage());
                        }
                    });
            boolean haveResumePosition = resumeWindow != C.INDEX_UNSET;
            if (haveResumePosition) {
                player.seekTo(resumeWindow, resumePosition);
            }
            player.prepare(videoSource);
        }
    }

关闭并释放播放器资源

 /**
     * 释放播放器
     */
    private void releasePlayer() {
        if (player != null) {
            updateResumePosition();
            player.release();
            player = null;
            trackSelector = null;
        }
    }

播放异常处理

实现 com.google.android.exoplayer2.Player.EventListener;接口,重写onPlayerError()方法。

Notice:github上的5.1.2版本才将Player.EventListener接口移到core模块,如果用的是2.4.x版本会遇到找不到Player类的错误。

  @Override
    public void onPlayerError(ExoPlaybackException error) {
        if (error != null) {
            Log.e(TAG, "onLoadError: " + error.getMessage());
            showToast("播放异常");
        }
        mErrorState = true;
        if (isBehindLiveWindow(error)) {
            clearResumePosition();
            initializePlayer();
        } else {
            updateResumePosition();
        }
    }

还原上次播放位置

    /**
     * 还原上次播放
     */
    private void updateResumePosition() {
        resumeWindow = player.getCurrentWindowIndex();
        resumePosition = Math.max(0, player.getContentPosition());
        Log.e(TAG, "resumeWindow: " + resumeWindow);
        Log.e(TAG, "resumePosition: " + resumePosition);
    }

重置上次播放

    private void clearResumePosition() {
        resumeWindow = C.INDEX_UNSET;
        resumePosition = C.TIME_UNSET;
    }

//end-以上就是google ExoPlayer播放器实现步骤。如果需要更多的定制内容,还请移步官方文档
https://google.github.io/ExoPlayer/guide.html


猜你喜欢

转载自blog.csdn.net/ZhijunHong/article/details/77930164