当前位置: 首页 > news >正文

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

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.PlayerViewandroid: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开发实战详解,含直播系统的搭建过程)》

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 「C++系列」动态内存
  • 超越sora,最新文生视频CogVideoX-5b模型分享
  • ChatGPT 在国内使用的方法
  • aws 容器镜像仓库操作
  • 数据结构——二叉搜索树
  • Java调用数据库 笔记05(查询篇)
  • 植物大战僵尸【源代码分享+核心思路讲解】
  • 【MySQL】获取最近7天和最近14天的订单数量,使用MySQL详细写出,使用不同的方法
  • openeuler 22.03 lts sp4 使用 kubeadm 部署 k8s-v1.28.2 高可用集群
  • CTF 技能树 LOG -GIT泄露 笔记
  • 身份安全风险不断上升:企业为何必须立即采取行动
  • Nginx反向代理出现502 Bad Gateway问题的解决方案
  • ES学习笔记
  • 制作一个rabbitmq-sdk以及rabbitmq消费者实现定时上下线功能
  • 怎么让Nginx可以访问某一IP的每个后台controller接口
  • 【译】JS基础算法脚本:字符串结尾
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Java超时控制的实现
  • js如何打印object对象
  • Koa2 之文件上传下载
  • laravel 用artisan创建自己的模板
  • Mac转Windows的拯救指南
  • Netty 4.1 源代码学习:线程模型
  • Node 版本管理
  • Vue组件定义
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 闭包,sync使用细节
  • 离散点最小(凸)包围边界查找
  • 前端之React实战:创建跨平台的项目架构
  • 正则表达式小结
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ()、[]、{}、(())、[[]]命令替换
  • (八)Flask之app.route装饰器函数的参数
  • (二)pulsar安装在独立的docker中,python测试
  • (理论篇)httpmoudle和httphandler一览
  • (六)Hibernate的二级缓存
  • (十三)Maven插件解析运行机制
  • (五)Python 垃圾回收机制
  • (一)基于IDEA的JAVA基础10
  • (原)本想说脏话,奈何已放下
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)LINQ之路
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .mysql secret在哪_MYSQL基本操作(上)
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .net SqlSugarHelper
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET中分布式服务
  • @Repository 注解
  • @RequestMapping-占位符映射
  • @selector(..)警告提示
  • [1]从概念到实践:电商智能助手在AI Agent技术驱动下的落地实战案例深度剖析(AI Agent技术打造个性化、智能化的用户助手)
  • [asp.net core]project.json(2)