【Android】使用Exoplayer播放视频
1.Android Studio 常用快捷键2.基于Android的“哲学家就餐问题”防死锁的设计与实现3.【Android】截图案例4.【Android】屏幕旋转时数据丢失问题解决方案5.【Android】使用 Broadcast 实现进程间通讯6.【Android】使用AIDL实现进程间通讯简单案例7.【Android】使用AIDL实现进程间传递对象案例8.【Android】使用Messenger实现进程间通讯9.【Android】使用Binder实现进程间通讯简单案例10.【Android】使用Binder实现进程间传递对象案例11.【Android】使用Socket实现跨设备通讯12.【Android】使用BluetoothSocket实现跨设备通讯
13.【Android】使用Exoplayer播放视频
14.【Android】使用 MediaMetadataRetriever 获取视频信息15.【Android】使用MediaExtractor、MediaMuxer去掉视频文件中的音频数据16.【Android】MediaCodec详解17.【Android】使用MediaExtractor获取关键帧的时间戳18.【Android】Message、Handler、MessageQueue、Looper 详解19.【Android】使用ContentProvider实现跨进程通讯20.【Android】使用 ContentObserver 监控统状态信息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);
声明:本文转自【Android】使用Exoplayer播放视频
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 【.NET】调用本地 Deepseek 模型