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

     

    ​
  • 相关阅读:
    Linux应用层开发(三)进程与线程简述
    Openlayers 中加载渲染 WMTS TMS XYZ WMS WFS 图层
    光流法optical flow
    计算机网络-计算机网路体系结构(概念,组成,功能,分类,标准化工作及相关组织,性能指标(速率,带宽,吞吐量,时延,时延带宽积,往返时间RTT,利用率))
    MybatisPlus逆向工程
    【EMQX】使用websocket订阅EMQX数据
    软考高级系统架构设计师论文真题分析系列之:论软件架构风格
    SparkSql中的窗口函数
    CANoe-vTESTstudio之Test Diagram编辑器(入门介绍)
    上N下P三极管推挽电路----》交越失真问题的解决
  • 原文地址:https://www.cnblogs.com/aqi00/p/18450140
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号