Android——使用Exoplayer播放视频

it2023-10-30  99

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(),如下:

repositories { google() jcenter() }

(2)添加依赖

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

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

(3)添加权限

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

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

(4)主类

MainActivity.java

package com.zhyan8.exoplayer; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import com.google.android.exoplayer2.DefaultLoadControl; import com.google.android.exoplayer2.DefaultRenderersFactory; import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.source.ExtractorMediaSource; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.ui.PlayerView; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; public class MainActivity extends AppCompatActivity { private PlayerView playerView; private SimpleExoPlayer player; public static final String[] permissions = { "android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.READ_EXTERNAL_STORAGE"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { if(Build.VERSION.SDK_INT>=23){ requestPermissions(permissions,1); } playerView = (PlayerView) findViewById(R.id.video_view); initializePlayer(); } private void initializePlayer() { player = ExoPlayerFactory.newSimpleInstance( new DefaultRenderersFactory(this), new DefaultTrackSelector(), new DefaultLoadControl()); playerView.setPlayer(player); Uri playUri = Uri.parse("file:///sdcard/Pictures/WeiXin/a.mp4"); MediaSource mediaSource = buildMediaSource(playUri); player.prepare(mediaSource, true, false); } private MediaSource buildMediaSource(Uri uri) { DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(this, "com.example.exoplayerdemo"); MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri); return videoSource; } }

(5)布局

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.zhyan8.exoplayer.MainActivity"> <com.google.android.exoplayer2.ui.PlayerView android:id="@+id/video_view" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout>

3 拓展

(1)循环播放

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

(2)视频拼接

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

(3)倍速播放

PlaybackParameters params = new PlaybackParameters(3, 3); // 3 倍速播放,参数1:帧率,参数2:频率 player.setPlaybackParameters(params);
最新回复(0)