android,Exoplayer实现视频播放器

Posted 寒夜美美

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android,Exoplayer实现视频播放器相关的知识,希望对你有一定的参考价值。

bundle配置:
implementation ‘com.google.android.exoplayer:exoplayer-core:2.8.1‘
implementation ‘com.google.android.exoplayer:exoplayer-dash:2.8.1‘
implementation ‘com.google.android.exoplayer:exoplayer-ui:2.8.1‘
show Dialogfragment:
Fragment prev = getCurrentActivity().getFragmentManager().findFragmentByTag("VideoDialogFragment");
if(prev!=null){
DialogFragment diaFragment = (DialogFragment)prev;
diaFragment.dismiss();
}
VideoPlayerFragment dialogFragment = new VideoPlayerFragment();
Bundle bundle = new Bundle();
bundle.putSerializable("videoUrl",视频地址);
bundle.putSerializable("videoName",视频名字);
dialogFragment.setArguments(bundle);
dialogFragment.show(getCurrentActivity().getFragmentManager(), "VideoDialogFragment");

DialogFragment:
public class VideoPlayerFragment extends DialogFragment {
    private ImageView screenImageView;
    private ImageView changeVoiceView;
    private TextView textVideoName;
    private LinearLayout mainVideoLayout;
    private LinearLayout videoLayout;
    private Window window;
    private Dialog dialog;

    private String videoUrl = null;
    private String videoName = null;
    private boolean isAllScreen = false;
    private boolean isOpenSound = true;
    private boolean isVideoMode = false;
    private int resumeWindow;
    private long resumePosition;
    private int videoScreenWidth;
    private int videoScreenHeight;

    private static Handler handler = new Handler();
    private SimpleExoPlayerView simpleExoPlayerView;
    private BandwidthMeter bandwidthMeter;
    private TrackSelection.Factory videoTrackSelectionFactory;
    private TrackSelector trackSelector;
    private SimpleExoPlayer player;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initPlayer();
    }

    private void initPlayer() {
        Common.silentSwitch(true);
        bandwidthMeter = new DefaultBandwidthMeter();//创建带宽
        videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);//创建轨道工厂
        trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);//创建轨道选择器实例
        setStyle(DialogFragment.STYLE_NO_TITLE, R.style.VideoTheme);
        if (ScreenUtils.isLandscape()) {
            videoScreenWidth = 900;
            videoScreenHeight = 620;
        } else {
            videoScreenWidth = 880;
            videoScreenHeight = 1564;
        }
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_exo_player, container);
        Bundle bundle = getArguments();
        if (bundle != null) {
            videoUrl = (String) bundle.getSerializable("videoUrl");
            videoName = (String) bundle.getSerializable("videoName");
            isVideoMode = (Boolean) bundle.getSerializable("isVideoMode");
        }

        dialog = getDialog();
        dialog.setCanceledOnTouchOutside(true);
        dialog.setCancelable(true);

        window = dialog.getWindow();
        window.setBackgroundDrawableResource(android.R.color.transparent);
        window.getDecorView().setPadding(0, 0, 0, 0);
        //获得窗体的属性
        WindowManager.LayoutParams lp = window.getAttributes();
        lp.gravity = Gravity.CENTER;
        lp.width = videoScreenWidth;
        lp.height = videoScreenHeight;
        window.setAttributes(lp);

        initView(view);
        openPlayer(view);
        startPlayer();
        return view;
    }

    private void initView(View view) {
        simpleExoPlayerView = (SimpleExoPlayerView) view.findViewById(R.id.simpleExoPlayerView);
        screenImageView = (ImageView) view.findViewById(R.id.btnAllScreen);
        mainVideoLayout = (LinearLayout) view.findViewById(R.id.mainVideoLayout);
        videoLayout = (LinearLayout) view.findViewById(R.id.videoLayout);
        textVideoName = (TextView) view.findViewById(R.id.videoName);
        if (!TextUtils.isEmpty(videoName)) {
            textVideoName.setText("当前正在播放:" + videoName);
        }
        if (isVideoMode) {
            screenImageView.setEnabled(false);
        } else {
            screenImageView.setEnabled(true);
        }
        changeVoiceView = (ImageView) view.findViewById(R.id.btnChangeVoice);
        changeVoiceView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isOpenSound) {
                    changeVoiceView.setImageResource(R.drawable.mute_btn);
                    Common.silentSwitch(isOpenSound);
                    isOpenSound = false;

                } else {
                    changeVoiceView.setImageResource(R.drawable.voice_btn);
                    Common.silentSwitch(isOpenSound);
                    isOpenSound = true;
                }
            }
        });
        screenImageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isAllScreen) {
                    window = dialog.getWindow();
                    //获得窗体的属性
                    WindowManager.LayoutParams lp = window.getAttributes();
                    lp.gravity = Gravity.CENTER;
                    lp.width = videoScreenWidth;
                    lp.height = videoScreenHeight;
                    window.setAttributes(lp);
                    screenImageView.setImageResource(R.drawable.allscreen_btn);
                    //videoLayout.setLayoutParams(new FrameLayout.LayoutParams(1000, 600));
                    isAllScreen = false;
                } else {
                    screenImageView.setImageResource(R.drawable.cancelscreen_btn);
                    window = dialog.getWindow();
                    //获得窗体的属性
                    WindowManager.LayoutParams lp = window.getAttributes();
                    lp.gravity = Gravity.CENTER;
                    lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
                    lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
                    window.setAttributes(lp);
                    //videoLayout.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,FrameLayout.LayoutParams.MATCH_PARENT));
                    isAllScreen = true;
                }
            }
        });
    }

    private void openPlayer(View view) {
        //创建播放器
        player = ExoPlayerFactory.newSimpleInstance(view.getContext(), trackSelector);
        //创建加载数据的工厂
        DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(view.getContext(),
                Util.getUserAgent(view.getContext(), "com.reactnativedemo"), (TransferListener<? super DataSource>) bandwidthMeter);

        //创建解析数据的工厂
        ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
        //传入Uri、加载数据的工厂、解析数据的工厂,就能创建出MediaSource
        String url = videoUrl;
        Uri mp4VideoUri = Uri.parse(url);
        MediaSource videoSource = new ExtractorMediaSource(mp4VideoUri,
                dataSourceFactory, extractorsFactory, null, null);
        //循环播放
        LoopingMediaSource loopingMediaSource = new LoopingMediaSource(videoSource);
        player.prepare(loopingMediaSource);
        player.addListener(eventListener);
        player.setPlayWhenReady(true);
    }

    private ExoPlayer.EventListener eventListener = new ExoPlayer.EventListener() {
        @Override
        public void onTimelineChanged(Timeline timeline, Object o, int i) {

        }

        @Override
        public void onTracksChanged(TrackGroupArray trackGroupArray, TrackSelectionArray trackSelectionArray) {

        }

        @Override
        public void onLoadingChanged(boolean b) {

        }

        @Override
        public void onPlayerStateChanged(boolean b, int i) {

        }

        @Override
        public void onRepeatModeChanged(int i) {

        }

        @Override
        public void onShuffleModeEnabledChanged(boolean b) {

        }

        @Override
        public void onPlayerError(ExoPlaybackException e) {
            if (player != null) {
                player.stop();
                player.release();
                player = null;
            }
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            Fragment prev = getFragmentManager().findFragmentByTag("VideoDialogFragment");
            if (prev != null) {
                ft.remove(prev);
            }
        }

        @Override
        public void onPositionDiscontinuity(int i) {

        }

        @Override
        public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

        }

        @Override
        public void onSeekProcessed() {
        }
    };

    private void startPlayer() {
        simpleExoPlayerView.setPlayer(player);
        //player.setPlayWhenReady(true);
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
    }


    @Override
    public void onResume() {
        super.onResume();
        if (player != null && player.getCurrentPosition() > 0) {
            player.setPlayWhenReady(true);
            player.seekTo(resumePosition);
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        if (player != null && player.getPlayWhenReady()) {
            resumeWindow = player.getCurrentWindowIndex();
            resumePosition = Math.max(0, player.getContentPosition());
            player.setPlayWhenReady(false);
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        //释放播放器
        if (player != null) {
            player.stop();
            player.release();
            player = null;
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        silentSwitch(false);
    }
}

  开关静音:

public static void silentSwitch(boolean isOpenVoice) {
try {
AudioManager mAudioManager = (AudioManager) context.getSystemService(Service.AUDIO_SERVICE);
if (mAudioManager != null) {
if (isOpenVoice) {
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
} else {
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 100, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
}
}
} catch (Exception e) {

}
}
作者原创,转载请注明原文地址。































以上是关于android,Exoplayer实现视频播放器的主要内容,如果未能解决你的问题,请参考以下文章

Android Widevine DASH 实现 + ExoPlayer

Android + exoplayer:本地播放AES加密视频

Android视频播放器Exoplayer自定义

Android TV 中的 ExoPlayer 以纵向模式而不是横向模式播放视频

如何从 vimeo 帐户检索视频源以在 exoplayer android 中播放?

Android TV Leanback Exoplayer 视频缩放问题