FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频

news2024/9/21 14:23:13

Android早期的MediaPlayer控件对于网络视频的兼容性很差,所以后来单独推出了Exoplayer库增强支持网络视频,在《Android Studio开发实战:从零基础到App上线(第3版)》一书第14章的“14.3.3  新型播放器ExoPlayer”就详细介绍了Exoplayer库的详细用法。
现在Android官方再次升级Exoplayer,并将其纳入了Jetpack的Media3第三代媒体库,作为音视频相关操作的统一处理引擎。升级后的Exoplayer就成为Media3的统一媒体播放引擎,提供了音频和视频播放的应用级组件,意欲在音视频渲染方向上一统江湖。
根据Android官网的介绍,ExoPlayer还摆脱设备和操作系统碎片化问题,让App代码以一致的方式运行于整个Android生态系统中。因为Media3是个很新很新的Jetpack库,所以它对开发环境要求比较高,需满足下列条件才能正常引入Media3。
1、开发工具要选用Android Studio Jellyfish(小水母版本)或更高版本。
2、Gradle版本不低于8.6。
3、App模块的build.gradle里面compileSdk和targetSdk要升级到34或者更高版本。
根据上述条件准备好了开发环境,再按照以下描述引入Media3的ExoPlayer库,详细步骤说明如下。

一、修改模块的build.gradle

在build.gradle的dependencies节点内部补充下面的导包语句,把ExoPlayer用到的相关库都加进来。

implementation "androidx.media3:media3-exoplayer:1.4.0"
implementation "androidx.media3:media3-exoplayer-hls:1.4.0"
implementation "androidx.media3:media3-exoplayer-rtsp:1.4.0"
implementation "androidx.media3:media3-ui:1.4.0"
implementation "androidx.media3:media3-common:1.4.0"
implementation "androidx.media3:media3-session:1.4.0"
implementation "androidx.media3:media3-datasource:1.4.0"
implementation "androidx.media3:media3-datasource-rtmp:1.4.0"

二、编辑播放界面的布局文件

打开播放界面的XML布局文件,给根布局添加如下的属性配置:

xmlns:app="http://schemas.android.com/apk/res-auto"

接着在布局内部添加来自ExoPlayer库的PlayerView控件节点,举例如下:

<!-- use_controller是否显示控制栏,show_timeout控制栏的消失间隔,show_buffering是否显示缓冲区,resize_mode大小调整模式 -->
<androidx.media3.ui.PlayerView
    android:id="@+id/pv_content"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:show_buffering="always"
    app:show_timeout="5000"
    app:use_controller="true"
    app:resize_mode="fit"/>

三、活动页面代码增加ExoPlayer的处理代码

首先补充下面一行代码声明PlayerView对象:

private ExoPlayer mPlayer; // 声明一个新型播放器对象

接着在onCreate方法里面补充以下代码,获取PlayerView对象,并对其设置ExoPlayer的播放器对象:

    PlayerView pv_content = findViewById(R.id.pv_content);
    mPlayer = new ExoPlayer.Builder(this).build();
    pv_content.setPlayer(mPlayer); // 设置播放器视图的播放器对象

然后添加下面的播放方法,开始播放指定链接的网络视频。

// 播放视频
private void playVideo(Uri uri) {
    DataSource.Factory factory = new DefaultDataSource.Factory(this);
    // 创建指定地址的媒体对象
    MediaItem videoItem = new MediaItem.Builder().setUri(uri).build();
    // 基于工厂对象和媒体对象创建媒体来源
    MediaSource videoSource;
    if (uri.getPath().endsWith("m3u8")) { // hls链接
        videoSource = new HlsMediaSource.Factory(factory)
                .createMediaSource(videoItem);
    } else if (uri.getPath().startsWith("rtsp")) { // rtsp链接
        videoSource = new RtspMediaSource.Factory()
                .createMediaSource(videoItem);
    } else if (uri.getPath().startsWith("rtmp")) { // rtmp链接
        videoSource = new ProgressiveMediaSource.Factory(new RtmpDataSource.Factory())
                .createMediaSource(videoItem);
    } else { // 其他链接(http开头或https开头的普通视频链接)
        videoSource = new ProgressiveMediaSource.Factory(factory)
                .createMediaSource(videoItem);
    }
    mPlayer.setMediaSource(videoSource); // 设置播放器的媒体来源
    mPlayer.prepare(); // 播放器准备就绪
    mPlayer.play(); // 播放器开始播放
}

从上述的播放代码可知,这里用到了ExoPlayer的四种播放形式,分别为:播放HLS链接、播放RTMP链接、播放RTSP链接、播放普通网络视频。

四、给AndroidManifest.xml补充互联网访问权限

打开AndroidManifest.xml,添加下面的互联网权限配置:

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

最后编译运行App,在真机上看到的播放器效果如下图所示。

可见成功把Media3的ExoPlayer库跑了起来,并且正常播放网络视频。

更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

本系列的FFmpeg进阶文章目录为《FFmpeg开发笔记全目录(FFmpeg开发实战详解,含直播系统的搭建过程)》

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

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

相关文章

stack和queue(一)

接下来讲解一些stack栈和queue的简单使用 stack的概念 stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行 元素的插入与提取操作。 特性是先进先出 后进后出 构造一个栈堆 int main() {deque<int>…

树莓派配置Qt+OpenCV

本次教程使用的树莓派镜像&#xff1a;树莓派镜像带图像界面下载 Qt的安装&#xff1a; 在命令行依次输入以下命令安装Qt&#xff1a; sudo apt-get updatesudo apt-get upgrade sudo apt-get install qtbase5-dev qtchooser sudo apt-get install qt5-qmake qtbase5-dev-t…

threejs加载高度图渲染点云,不支持tiff

问题点 使用的point来渲染高度图点云&#xff0c;大数据图片无效渲染点多&#xff08;可以通过八叉树过滤掉无效点增加效率&#xff0c;这个太复杂&#xff09;&#xff0c;但是胜在简单能用 效果图 code 代码可运行&#xff0c;无需npm <!DOCTYPE html> <html la…

MySQL聚合统计和内置函数

【数据库】MySQL聚合统计 王笃笃-CSDN博客https://blog.csdn.net/wangduduniubi?typeblog显示平均工资低于2000的部门和它的平均工资 mysql> select deptno,avg(sal) deptavg from emp group by deptno; --------------------- | deptno | deptavg | --------------…

0x08 MotionEye 视频监控组件 list 信息泄漏洞 CVE-2022-25568

参考&#xff1a; MotionEye 视频监控组件 list 信息泄漏洞 CVE-2022-25568 | PeiQi文库 (wgpsec.org) 一、漏洞描述&#xff1a; motionEye是用Python写的motion的Web前端&#xff0c;它可以监视视频信号并检测运动。它可以与多种类型的摄像机配合使用,也可以与电影文件一起…

PMP--二模--解题--41-50

文章目录 11.风险管理--风险代表对将来问题的预判&#xff0c;问题代表对过去问题事件的跟踪&#xff1b;两者联系&#xff1a;风险发生后会变成问题&#xff0c;而问题可能导致新的风险。41、 [单选] 在项目会议期间&#xff0c;一个团队发现三个月前关闭的问题仍然处于活跃状…

解决 Prettier ESLint 错误

解决 Prettier ESLint 错误 在 Vue.js 项目中使用 ESLint 和 Prettier 时&#xff0c;你可能会遇到类似以下的错误&#xff1a; frontend\src\views\dashboard\MobileConfigPanel.vue1:25 error Delete ␍ …

使用IDA Pro动态调试Android APP

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 关于 android_server android_server 是 IDA Pro 在 Android 设备上运行的一个调试服务器。 通过在 Android 设备上运行android_server&#xff0c;IDA Pro …

SpringBoot项目同时集成Mybatis和Mybatis-plus框架

1. 背景 Mybatis-plus可以生成CRUD&#xff0c;减少开发中SQL编写量&#xff0c;但是某些情况下我们需要多表关联查询&#xff0c;这时候Mybatis可以手写SQL的优势就体现出来了&#xff0c;在实际开发中&#xff0c;项目里面一般都是Mybatis和Mybatis-Plus公用&#xff0c;但是…

【Geoserver使用】Geoserver 3前瞻

文章目录 前言一、GeoServer 3 Call for Crowdfunding&#xff08;GeoServer 3 呼吁众筹&#xff09;二、Geoserver 3升级内容1.升级到3的几个原因2.Geoserver 3的四个升级方向 总结 前言 今天来看看最近Geoserver官方发布的关于Geoserver 3重大升级众筹这篇官方博客中提到的几…

漫步者头戴式耳机怎么样?漫步者、西圣、索尼三大耳机测评对比

自头戴式耳机诞生以来&#xff0c;凭借其出色的音质表现和时尚造型&#xff0c;迅速赢得了音乐爱好者的青睐。头戴式耳机不仅能够带来更加沉浸的听觉体验&#xff0c;还具备较强的降噪功能&#xff0c;让用户在嘈杂环境中依然能专注于音乐世界。 与入耳式耳机相比&#xff0c;…

【PyVista】网状结构,标和单元[mesh,point,cell]的介绍

[PyVista] 介绍-CSDN博客中介绍给pyvista的介绍和简单的使用。接下来看看mesh的使用。 一&#xff0c;什么是网格? 在PyVista中&#xff0c;网格是任何空间引用信息&#xff0c;通常由三维空间中的表面或体积的几何表示组成。我们通常将任何空间引用的数据集称为网格&#xf…

回归预测 | Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量…

【java】常见限流算法原理及应用

目录 前言 限流的作用 4种常见限流算法 固定窗口限流 基本原理 简单实现 优点和缺点 滑动窗口限流 基本原理 简单实现 优点和缺点 漏桶限流 基本原理 简单实现 优点和缺点 令牌桶限流 基本原理 简单实现 优点和缺点 算法比较与选择 前言 在现代分布式系统…

102.SAPUI5 sap.ndc.BarcodeScannerButton调用摄像头时,localhost访问正常,使用IP访问失败

目录 原因 解决办法 1.修改谷歌浏览器的setting 2.在tomcat中配置https访问 参考 使用SAPUI5的sap.ndc.BarcodeScannerButton调用摄像头时&#xff0c;localhost访问正常&#xff0c;使用IP访问时&#xff0c;一直打不开摄像头&#xff0c;提示getUserMedia()问题。 原因…

【React】(推荐项目)一个用 React 构建的 CRUD 应用程序

推荐项目&#xff1a;CRUD 应用示例 在本篇文章中&#xff0c;我想向大家推荐一个非常实用的项目&#xff1a;CRUD 应用示例。这个项目展示了如何使用现代技术栈创建一个基础的增删改查&#xff08;CRUD&#xff09;应用&#xff0c;非常适合用于学习和实践后端开发技能。 适…

【工具变量】科技金融试点城市DID数据集(2000-2023年)

时间跨度&#xff1a;2000-2023年数据范围&#xff1a;286个地级市包含指标&#xff1a; year city treat post DID&#xff08;treat*post&#xff09; 样例数据&#xff1a; 包含内容&#xff1a; 全部内容下载链接&#xff1a; 参考文献-pdf格式&#xff1a;https://…

Navicat连接SQLServer报错

一、Navicat连接SQLServer报错 1.1、问题描述 由于项目原因&#xff0c;需要使用SQLServer作为数据源。Navicat中新建SQLServer的连接&#xff0c;填写完必要信息后连接失败&#xff0c;报错原因如下&#xff1a; 1.2、Navicat的版本 1.3、解决方法 第一步&#xff1a;下载【s…

工厂模式,策略模式,代理模式,单例模式在项目中的应用

项目背景&#xff1a; 首先这篇文章是总结了OJ项目和AI答题平台项目&#xff08;和一点点的聚合搜索项目&#xff09;中设计模式的文章 在项目中也用了很多次的设计模式&#xff0c;我感觉起来&#xff0c;这些设计模式的作用就是提高项目的扩展性和降低耦合性 工厂模式&…

Gitlab学习(007 gitlab项目操作)

尚硅谷2024最新Git企业实战教程&#xff0c;全方位学习git与gitlab 总时长 5:42:00 共40P 此文章包含第25p-第p26的内容 文章目录 推送项目到gitlabidea安装gitlab插件配置免密登录推送项目到远程库 在gitlab上创建项目额外功能的使用推送分支到远程库标记功能创建合并请求 推…