当前位置:   article > 正文

【Android】使用Exoplayer播放视频_exoplayer 播放多个视频

exoplayer 播放多个视频

1 前言

        ExoPlayer 是 google 开源的应用级媒体播放器,github源码 → https://github.com/google/ExoPlayer。相较于 MediaPlayer,ExoPlayer 具有以下优点:

  • 支持更多的视频播放格式(包含 DASH 和 SmoothStreaming,这2种 MediaPlayer 不支持)
  • 通过组件化自定义播放器,方便扩展定制
  • 持久的高速缓存

        ExoPlayer 框架中组件主要有:

  • MediaSource:媒体资源,用于定义要播放的媒体。通过 player.prepare() 注入。使用 LoopingMediaSource 类指定媒体循环播放次数;ConcatenatingMediaSource 可以无缝拼接媒体资源。
  • Renderer:渲染器,用于渲染媒体文件。创建 player 时,Renderers 被注入。
  • TrackSelector:轨道选择器,用于选择 MediaSource 提供的轨道(tracks),供每个可用的渲染器使用。创建 player 时,TrackSelector 被注入。
  • LoadControl:用于控制 MediaSource 何时缓冲更多的媒体资源以及缓冲多少媒体资源。创建 player 时,LoadControl 被注入。

2 案例

        (1)添加仓库

        在项目 build.gradle 中添加 google(),如下:

  1. repositories {
  2. google()
  3. jcenter()
  4. }

        (2)添加依赖

        在模块 build.gradle 中的 dependencies 下添加 ExoPlayer 框架依赖,如下:

implementation 'com.google.android.exoplayer:exoplayer:2.8.1'

        (3)添加权限

        在 AndroidManifest.xml 中的 manifest 标签(application 同级标签)下添加外部存储读写权限,如下:

  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  2. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

        (4)主类

        MainActivity.java

  1. package com.zhyan8.exoplayer;
  2. import android.net.Uri;
  3. import android.os.Build;
  4. import android.os.Bundle;
  5. import android.support.v7.app.AppCompatActivity;
  6. import com.google.android.exoplayer2.DefaultLoadControl;
  7. import com.google.android.exoplayer2.DefaultRenderersFactory;
  8. import com.google.android.exoplayer2.ExoPlayerFactory;
  9. import com.google.android.exoplayer2.SimpleExoPlayer;
  10. import com.google.android.exoplayer2.source.ExtractorMediaSource;
  11. import com.google.android.exoplayer2.source.MediaSource;
  12. import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
  13. import com.google.android.exoplayer2.ui.PlayerView;
  14. import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
  15. public class MainActivity extends AppCompatActivity {
  16. private PlayerView playerView;
  17. private SimpleExoPlayer player;
  18. public static final String[] permissions = {
  19. "android.permission.WRITE_EXTERNAL_STORAGE",
  20. "android.permission.READ_EXTERNAL_STORAGE"};
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState) {
  23. super.onCreate(savedInstanceState);
  24. setContentView(R.layout.activity_main);
  25. init();
  26. }
  27. private void init() {
  28. if(Build.VERSION.SDK_INT>=23){
  29. requestPermissions(permissions,1);
  30. }
  31. playerView = (PlayerView) findViewById(R.id.video_view);
  32. initializePlayer();
  33. }
  34. private void initializePlayer() {
  35. player = ExoPlayerFactory.newSimpleInstance(
  36. new DefaultRenderersFactory(this),
  37. new DefaultTrackSelector(),
  38. new DefaultLoadControl());
  39. playerView.setPlayer(player);
  40. Uri playUri = Uri.parse("file:///sdcard/Pictures/WeiXin/a.mp4");
  41. MediaSource mediaSource = buildMediaSource(playUri);
  42. player.prepare(mediaSource, true, false);
  43. }
  44. private MediaSource buildMediaSource(Uri uri) {
  45. DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(this, "com.example.exoplayerdemo");
  46. MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
  47. return videoSource;
  48. }
  49. }

        (5)布局

        activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. tools:context="com.zhyan8.exoplayer.MainActivity">
  7. <com.google.android.exoplayer2.ui.PlayerView
  8. android:id="@+id/video_view"
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent"/>
  11. </RelativeLayout>

3 拓展

        (1)循环播放

  1. MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
  2. LoopingMediaSource loopingSource = new LoopingMediaSource(videoSource, 5); // 循环播放 5 次
  3. player.prepare(loopingSource, true, false);

        (2)视频拼接

  1. MediaSource videoSource1 = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri_a);
  2. MediaSource videoSource2 = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri_b);
  3. ConcatenatingMediaSource concatenatedSource = new ConcatenatingMediaSource(videoSource1, videoSource2); // 无缝拼接资源
  4. player.prepare(concatenatedSource, true, false);

        (3)倍速播放

  1. PlaybackParameters params = new PlaybackParameters(3, 3); // 3 倍速播放,参数1:帧率,参数2:频率
  2. player.setPlaybackParameters(params);
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/299267
推荐阅读
相关标签
  

闽ICP备14008679号