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

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.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.kler.cn/news/315463.html

相关文章:

  • Java 入门指南:JVM(Java虚拟机)——类的生命周期与加载过程
  • web基础—dvwa靶场(八)SQL Injection(Blind)
  • 众数信科AI智能体政务服务解决方案——寻知智能笔录系统
  • ‌内网穿透技术‌总结
  • SpringCloud config native 配置
  • mysql性能优化- 数据库配置优化
  • java面试题第一弹
  • Mybatis Plus分页查询返回total为0问题
  • PostgreSQL技术内幕10:PostgreSQL事务原理解析-日志模块介绍
  • 若依框架多次list查询时,分页失效
  • 使用Apache SeaTunnel高效集成和管理SftpFile数据源
  • 伊犁云计算22-1 apache 安装rhel8
  • C++:tinyxml2用于解析、操作和生成XML文件
  • Git基本用法总结
  • ZYNQ学习--AXI总线协议
  • 001.docker30分钟速通版
  • 深入 mysql,掌握一对一、一对多、多对多表设计、查询及级联操作
  • 鸿蒙ms参考
  • 聚类_K均值
  • 基于 Web 的工业设备监测系统:非功能性需求与标准化数据访问机制的架构设计
  • git重置本地提交与远程保持一致
  • 阅读笔记——《围城》
  • git 版本管理的常用命令
  • c++249多态
  • 【计算机网络篇】计算机网络概述
  • 安全第一:API 接口接入前的防护性注意要点
  • Java21 中的虚拟线程
  • 校园美食猎人:Spring Boot技术的美食探索应用
  • xxl-job适配sqlite本地数据库及mysql数据库。可根据配置指定使用哪种数据库。
  • 鸿蒙OS 线程间通信