使用改头换面之后的ExoPlayer实现Android视频播放

使用 ExoPlayer 实现 Android 视频播放

概览

在 Android 应用开发中实现视频播放是一个常见需求,尤其在视频流和 IPTV 应用中更为突出。本文将介绍如何在 Android 应用中使用 ExoPlayer 实现高效、流畅的视频播放,内容将包括 Java 和 Kotlin 两种语言的实现。

添加依赖

在项目的 build.gradle 文件中添加 ExoPlayer 的依赖:

implementation 'androidx.media3:media3-exoplayer:1.3.0'
implementation 'androidx.media3:media3-exoplayer-dash:1.3.0'
implementation 'androidx.media3:media3-ui:1.3.0'

布局配置

在布局文件中(如 activity_main.xml),添加 PlayerView

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><androidx.media3.ui.PlayerViewandroid:id="@+id/player_view"android:layout_width="match_parent"android:layout_height="match_parent"app:resize_mode="fill" /><!-- 其他 UI 元素 --></RelativeLayout>

PlayerView 配置为填充整个屏幕,使用 resize_mode 属性设置为“fill”。

初始化 ExoPlayer

Kotlin

private lateinit var player: ExoPlayerprivate fun initializePlayer() {player = ExoPlayer.Builder(this).build()val playerView: PlayerView = findViewById(R.id.player_view)playerView.player = playerplayerView.useController = false // 根据需求启用或禁用控制器
}

Java

private ExoPlayer player;private void initializePlayer() {player = new ExoPlayer.Builder(this).build();PlayerView playerView = findViewById(R.id.player_view);playerView.setPlayer(player);playerView.setUseController(false); // 根据需求启用或禁用控制器
}

播放视频流

Kotlin

private fun playChannel(channelUrl: String) {val videoUri = Uri.parse(channelUrl)val mediaItem = MediaItem.fromUri(videoUri)player.setMediaItem(mediaItem)player.prepare()player.play()
}

Java

private void playChannel(String channelUrl) {Uri videoUri = Uri.parse(channelUrl);MediaItem mediaItem = MediaItem.fromUri(videoUri);player.setMediaItem(mediaItem);player.prepare();player.play();
}

用户交互

Kotlin

override fun dispatchKeyEvent(event: KeyEvent): Boolean {// 处理按键事件,例如显示或隐藏频道列表return super.dispatchKeyEvent(event)
}

Java

@Override
public boolean dispatchKeyEvent(KeyEvent event) {// 处理按键事件,例如显示或隐藏频道列表return super.dispatchKeyEvent(event);
}

监听播放状态

Kotlin

private fun setupPlayerListener() {val playerListener = object : Player.Listener {override fun onPlaybackStateChanged(playbackState: Int) {// 根据播放状态更新 UI 或执行其他操作}override fun onPlayerError(error: PlaybackException) {// 处理播放错误}}player.addListener(playerListener)
}

Java

private void setupPlayerListener() {Player.Listener playerListener = new Player.Listener() {@Overridepublic void onPlaybackStateChanged(int playbackState) {// 根据播放状态更新 UI 或执行其他操作}@Overridepublic void onPlayerError(PlaybackException error) {// 处理播放错误}};player.addListener(playerListener);
}

结语

使用 ExoPlayer 在 Android 应用中实现视频播放既简单又高效。通过遵循上述步骤,开发者可以轻松集成视频播放功能,无论是使用 Java 还是 Kotlin,都能为用户提供高质量的视频观看体验。

ExoPlayer 提供的灵活性和强大的功能使其成为 Android 视频播放的首选库。开发者可以根据具体需求对播放器进行高度定制,包括视频源的选择、播放器控制、界面定制以及状态监听等。

此外,对于需要特殊视频格式支持或额外功能的应用,ExoPlayer 提供了广泛的扩展和插件,使其能够应对各种复杂和高级的播放需求。

最后,无论你选择 Kotlin 还是 Java,ExoPlayer 的集成过程都是直接且高效的,能够帮助你快速实现强大且流畅的视频播放功能。随着 Kotlin 在 Android 开发中越来越流行,利用它的现代语言特性和简洁语法,可以进一步提高开发效率和代码质量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/777010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年数字IC秋招-海康威视-数字逻辑设计工程师-笔试题

文章目录 前言一、多选题1、下面属于AXI定义的传输通道的是2、在SystemVerilog语言中&#xff0c;如果想要约束随机变量x在a和b之间&#xff0c;以下代码中正确的是?3、UVM的通信接口类型包括哪些?4、常见的代码覆盖率收集包括哪些?5、关于linux和windows操作系统的使用&…

Windows无法安装torch==1.4.0

在conda中&#xff0c;每创建一个虚拟环境&#xff0c;就要重新配置其中的pytorch 这次我创建的虚拟环境需要torch1.4.0的版本。 torch网址&#xff1a;https://pytorch.org/get-started/previous-versions/ 解决办法 按以下代码进行安装&#xff1a; pip install torch0.4.0…

JAVA HTTP大文件断点续传上传

功能&#xff1a;大文件上传&#xff0c;断点续传&#xff0c;文件夹上传&#xff0c;重复文件检测&#xff0c;离线进度信息保存&#xff0c;音视频信息读取 优势&#xff1a;无限授权&#xff0c;开源开放&#xff08;自主可控&#xff09;&#xff0c;长期维护 场景&#…

线程创建的几种方式

1.继承Thread类 class MyThread extends Thread {public void run() {// 线程执行的任务for (int i 0; i < 5; i) {System.out.println("Thread: " i);try {Thread.sleep(1000); // 使线程休眠 1 秒} catch (InterruptedException e) {e.printStackTrace();}}}…

unity中 鼠标按下移动端与pc端的位置

if (Input.GetMouseButtonDown(0)) { Vector2 V Input.touchCount > 0 ? Input.GetTouch(0).position : new Vector2(Input.mousePosition.x, Input.mousePosition.y); } 射线检测 if (Input.GetMouseButtonDown(0)) { …

动态规划入门(数字三角形模型)

备战2024年蓝桥杯&算法学习 -- 每日一题 Python大学A组 试题一&#xff1a;摘花生 试题二&#xff1a;最低通行费用 试题三&#xff1a;方格取数 试题四&#xff1a;传纸条 试题一&#xff1a;摘花生 【题目描述】 Hello Kitty想摘点花生送给她喜…

CImage 类及其常用成员函数用法实例详解 一

Cimage类是一个用于处理图像的类&#xff0c;它的主要用途是方便地创建、编辑、保存和显示图像。Cimage类支持多种图像文件格式&#xff0c;包括BMP、GIF、JPG、PNG和TIF等。较CBitmap类使用起来更方便。其构造函数及成员函数如下&#xff1a; 下面详细说明CImage常用成员函数的…

mysql80-DBA数据库学习1-数据库安装

掌握能力 核心技能 核心技能 mysql部署 官网地址www.mysql.com 或者www.oracle.com https://dev.mysql.com/downloads/repo/yum/ Install the RPM you downloaded for your system, for example: yum install mysql80-community-release-{platform}-{version-number}.noarch…

String类相关oj练习

1.第一次只出现一次的字符 做题首先看清要求和提示&#xff1a; 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 提示&#xff1a; 1 < s.length < 105s 只包含小写字母 这就要用到我们所学…

如祺出行冲刺上市:三年被罚款270万元,销售费用远高于研发开支

3月26日&#xff0c;Chenqi Technology Limited&#xff08;如祺出行&#xff09;再次递交招股书&#xff0c;准备在港交所主板上市&#xff0c;中金公司、华泰国际、农银国际为其联席保荐人。据贝多财经了解&#xff0c;如祺出行曾于2023年8月递表。 相较于此前招股书&#xf…

蓝桥杯 java 凑算式 16年省赛Java组真题

题目 思路&#xff1a; 求有多少种解法 比如:68/3952/714就是一种解法&#xff0c;53/1972/486 是另一种解法 8/3952/714是可以除尽的 但是后面一个不行 所以我们也要通分 代码&#xff1a; public class 凑算式 {static int[] a {1, 2, 3, 4, 5, 6, 7, 8, 9};static int c…

Docker常见软件部署2

1 docker 安装redis集群 docker 安装redis集群&#xff0c;3主3从的配置。 1 创建一个redis通信网卡 #创建一个redis集群使用的网卡 docker network create redis --subnet 172.38.0.0/16 2 创建6个redis的配置文件 #通过脚本创建六个redis配置&#xff0c;复制下面命令直接…

Thingworx高可用集群部署(八)-Ignite集群部署

主机&#xff1a;10.10.10.62、10.10.10.63、10.10.10.64、10.10.10.65 服务器配置 关闭防火墙 setenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config systemctl stop firewalld systemctl disable firewalld 配置内核参数 cat >> /etc/s…

代码随想录算法训练营 DAY 23 | 450.删除二叉搜索树中的节点 669.修剪二叉搜索树 538.把二叉搜索树转换为累加树

669.修剪二叉搜索树 误区&#xff1a;节点不在范围内不能直接return null&#xff0c;因为它的右子树是可能符合边界的。虽然要删除这个节点&#xff0c;但还要先继续遍历右子树。 递归套递归&#xff0c;删除修剪的同时去递归修剪左/右子树&#xff0c;然后在下面递归左右子…

DBRX: A New State-of-the-Art Open LLM——基于专家LLM

刷知乎的时候&#xff0c;发现最近开源了一个新的大模型DBRX&#xff0c;同样是基于专家的大模型。之前找MOE的源码没找到&#xff0c;仅仅找到了一些博主写的博客内容&#xff0c;简单了解了一下内容。之前写的模型&#xff1a;Mixtral MOE代码理解添加链接描述。简单看了一下…

Kubernetes 知识体系 系列一

多年前&#xff0c;大多数软件应用程序都是大型的单体&#xff0c;要么作为单个进程运行&#xff0c;要么作为少数服务器上的少量进程运行。这种过时的系统一直延续很久。 它们的发布周期较慢&#xff0c;更新相对较少。 在每个发布周期结束时&#xff0c;开发人员将整个系统…

揭秘大型语言模型的动力之源:为何GPU不可或缺?

引言 大型语言模型&#xff08;Large Language Models, LLMs&#xff09;是当今人工智能领域最令人瞩目的技术之一&#xff0c;其在自然语言处理&#xff08;NLP&#xff09;、文本生成、对话系统等方面展现出了惊人的潜力。其中&#xff0c;像GPT-3和BERT等代表了这一领域的顶…

第三十二天-PythonWeb主流框架-Django框架

目录 1.介绍 发展历史 介绍 2.使用 1.安装 2.创建项目 3.项目结构 4.启动 3.开发流程 1.设置ip可访问 2.创建模块 3.第一个页面 4.视图 5.include()参数 6.url与视图的关系 7.响应内容 4.视图处理业务逻辑 1.响应html 2.获取url参数 3.从文件响应html内容 …

蓝桥杯真题Day40 倒计时19天 纯练题!

蓝桥杯第十三届省赛真题-统计子矩阵 题目描述 给定一个 N M 的矩阵 A&#xff0c;请你统计有多少个子矩阵 (最小 1 1&#xff0c;最大 N M) 满足子矩阵中所有数的和不超过给定的整数 K? 输入格式 第一行包含三个整数 N, M 和 K. 之后 N 行每行包含 M 个整数&#xf…

企业产品网络安全建设日志0328

文章目录 Actuator再次暴露域名上线基线检查初见效果WAF更新遇波折301跳转推进中 Actuator再次暴露 为了验证挖f的拦截效果&#xff0c;自己随手拼了个Actuator&#xff0c;结果可以访问到公司的actuator。。 据称是某网关更换新组件后未做防御&#xff0c;已要求全部做防御&a…