码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频


    合集 - FFmpeg开发实战(57)
    1.FFmpeg开发笔记(一)搭建Linux系统的开发环境2023-04-162.FFmpeg开发笔记(二)搭建Windows系统的开发环境2023-04-293.FFmpeg开发笔记(三)FFmpeg的可执行程序介绍03-094.FFmpeg开发笔记(四)FFmpeg的动态链接库介绍03-105.FFmpeg开发笔记(五)更新MSYS的密钥环03-166.FFmpeg开发笔记(六)如何访问Github下载FFmpeg源码03-177.FFmpeg开发笔记(九)Linux交叉编译Android的x265库03-308.FFmpeg开发笔记(十)Linux环境给FFmpeg集成vorbis和amr03-319.FFmpeg开发笔记(十一)Windows环境给FFmpeg集成vorbis和amr04-0510.FFmpeg开发笔记(七)欧拉系统编译安装FFmpeg03-2311.FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库03-2412.FFmpeg开发笔记(十二)Linux环境给FFmpeg集成libopus和libvpx04-0613.FFmpeg开发笔记(十三)Windows环境给FFmpeg集成libopus和libvpx04-1314.FFmpeg开发笔记(十四)FFmpeg音频重采样的缓存04-1415.FFmpeg开发笔记(十五)详解MediaMTX的推拉流04-2016.FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库04-2117.FFmpeg开发笔记(十七)Windows环境给FFmpeg集成字幕库libass04-2718.FFmpeg开发笔记(十八)FFmpeg兼容各种音频格式的播放05-0419.FFmpeg开发笔记(十九)FFmpeg开启两个线程分别解码音视频05-0520.FFmpeg开发笔记(二十)Linux环境给FFmpeg集成AVS3解码器05-1221.FFmpeg开发笔记(二十一)Windows环境给FFmpeg集成AVS3解码器05-1822.FFmpeg开发笔记(二十二)FFmpeg中SAR与DAR的显示宽高比05-1923.FFmpeg开发笔记(二十三)使用OBS Studio开启RTMP直播推流05-2624.FFmpeg开发笔记(二十四)Linux环境给FFmpeg集成AV1的编解码器05-2725.FFmpeg开发笔记(二十五)Linux环境给FFmpeg集成libwebp06-0126.FFmpeg开发笔记(二十六)Linux环境安装ZLMediaKit实现视频推流06-0227.FFmpeg开发笔记(二十七)解决APP无法访问ZLMediaKit的直播链接问题06-0828.FFmpeg开发笔记(二十八)Linux环境给FFmpeg集成libxvid06-0929.FFmpeg开发笔记(二十九)Windows环境给FFmpeg集成libxvid06-1530.FFmpeg开发笔记(三十)解析H.264码流中的SPS帧和PPS帧06-1631.FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流06-2232.FFmpeg开发笔记(三十二)利用RTMP协议构建电脑与手机的直播Demo06-2333.FFmpeg开发笔记(三十三)分析ZLMediaKit对H.264流的插帧操作06-2934.FFmpeg开发笔记(三十四)Linux环境给FFmpeg集成libsrt和librist06-3035.FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt07-0636.FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流07-0737.FFmpeg开发笔记全目录(FFmpeg开发实战详解,含直播系统的搭建过程)06-1738.FFmpeg开发笔记(三十七)分析SRS对HLS协议里TS包的插帧操作07-1339.FFmpeg开发笔记(三十八)APP如何访问SRS推流的RTMP直播地址07-1440.FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg07-2041.FFmpeg开发笔记(四十)Nginx集成rtmp模块实现RTMP推拉流07-2142.FFmpeg开发笔记(四十一)结合OBS与MediaMTX实现SRT直播推流07-2743.FFmpeg开发笔记(四十二)使用ZLMediaKit开启SRT视频直播服务07-2844.FFmpeg开发笔记(四十三)使用SRS开启SRT协议的视频直播服务08-0345.FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP08-0446.FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流08-1047.FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo08-1148.FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向08-1749.FFmpeg开发笔记(四十八)从0开始搭建直播系统的开源软件架构08-1850.FFmpeg开发笔记(四十九)助您在毕业设计中脱颖而出的几个流行APP08-3151.FFmpeg开发笔记(五十)聊聊几种流媒体传输技术的前世今生09-0152.FFmpeg开发笔记(五十一)适合学习研究的几个音视频开源框架09-0753.FFmpeg开发笔记(五十二)移动端的国产视频播放器GSYVideoPlayer09-0854.FFmpeg开发笔记(五十三)移动端的国产直播录制工具EasyPusher09-2155.FFmpeg开发笔记(五十四)使用EasyPusher实现移动端的RTSP直播09-2256.FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势10-12
    57.FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频10-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控件节点,举例如下:

    
    <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开发实战:从零基础到短视频上线》一书。

     

    ​
  • 相关阅读:
    第一届电子纸产业创新应用论坛
    接口自动化测试思路和实战(3):测试库框架
    倒置字符串、猜名次、猜凶手、杨辉三角
    【深入浅出 Yarn 架构与实现】5-1 Yarn 资源调度器基本框架
    软件包 - 笔记
    什么是产线工控安全,如何保障产线设备的安全
    基于SSM和Web实现的农作物生长监控系统设计与实现
    How to get active Profiles in Spring
    使用学校的服务器跑深度学习
    【ML】机器学习数据集:sklearn中分类数据集介绍
  • 原文地址:https://www.cnblogs.com/aqi00/p/18450140
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号