首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ExoPlayer将进度条定位在播放器视图的下方

ExoPlayer 是一个开源的媒体播放库,专为 Android 平台设计,提供了比 Android 原生 MediaPlayer 更多的功能和灵活性。将进度条定位在播放器视图的下方是一种常见的用户界面设计,可以提供更好的用户体验。

基础概念

ExoPlayer: 是一个用于播放音频和视频的库,它支持多种格式和高级功能,如自适应流媒体(DASH, HLS)、DRM 支持等。

进度条: 在媒体播放器中,进度条用于显示当前播放位置,并允许用户跳转到视频的不同部分。

相关优势

  1. 用户体验: 将进度条放在下方可以让用户在观看视频时更容易地查看和控制播放进度。
  2. 空间利用: 这种布局可以更有效地利用屏幕空间,尤其是在移动设备上。
  3. 一致性: 许多流行的视频平台都采用这种设计,用户对此已经习惯。

类型与应用场景

类型:

  • 内置进度条: 直接集成在 ExoPlayer 的 UI 组件中。
  • 自定义进度条: 开发者可以根据需要自定义进度条的外观和行为。

应用场景:

  • 在线视频服务: 如 YouTube, Netflix 等。
  • 教育应用: 需要精确控制播放进度的场景。
  • 企业培训应用: 提供视频教程的应用。

实现方法

以下是一个简单的示例代码,展示如何在 ExoPlayer 中添加一个位于播放器视图下方的进度条。

代码语言:txt
复制
// 初始化 ExoPlayer
SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build();
playerView.setPlayer(player);

// 准备媒体资源
MediaItem mediaItem = MediaItem.fromUri("https://www.example.com/video.mp4");
player.setMediaItem(mediaItem);
player.prepare();

// 创建进度条
SeekBar seekBar = findViewById(R.id.seek_bar);

// 更新进度条
player.addListener(new Player.EventListener() {
    @Override
    public void onPlaybackStateChanged(int playbackState) {
        if (playbackState == Player.STATE_READY) {
            updateSeekBar();
        }
    }
});

// 更新进度条的方法
private void updateSeekBar() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if (player != null) {
                int currentPosition = (int) player.getCurrentPosition();
                int duration = (int) player.getDuration();
                seekBar.setMax(duration);
                seekBar.setProgress(currentPosition);
                seekBar.postDelayed(this, 1000); // 每秒更新一次
            }
        }
    });
}

// 处理进度条的拖动事件
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (fromUser) {
            player.seekTo(progress);
        }
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {}

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {}
});

可能遇到的问题及解决方法

问题: 进度条更新不及时或不准确。 原因: 可能是由于更新频率不够高或者更新逻辑有误。 解决方法: 增加更新频率(如每秒更新一次),并确保在播放状态改变时正确处理进度条的更新。

问题: 进度条与实际播放位置不同步。 原因: 可能是由于网络延迟或播放器内部状态更新不及时。 解决方法: 确保在播放器状态为 STATE_READY 时开始更新进度条,并在网络状况不佳时提供适当的缓冲机制。

通过上述方法,可以有效地在 ExoPlayer 中实现一个位于播放器视图下方的进度条,提升用户体验和应用的功能性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

》一书第14章的“14.3.3  新型播放器ExoPlayer”就详细介绍了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); // 设置播放器视图的播放器对象然后添加下面的播放方法,开始播放指定链接的网络视频。...    mPlayer.prepare(); // 播放器准备就绪    mPlayer.play(); // 播放器开始播放}从上述的播放代码可知,这里用到了ExoPlayer的四种播放形式,分别为:

48810

04.视频播放器通用架构实践

ExoPlayer、MediaPlayer,声网RTC视频播放器内核,原生MediaPlayer可以自由切换 对于视图状态切换和后期维护拓展,避免功能和业务出现耦合。...比如播放中需要更新UI进度条,播放异常需要显示异常UI,都比较难处理播放器状态变化更新UI操作 UI难以自定义或者修改麻烦 比如常见的视频播放器,会把视频各种视图写到xml中,这种方式在后期代码会很大,...02.业务需求的目标 常见的业务需求 基础封装视频播放器player,可以在ExoPlayer、MediaPlayer,声网RTC视频播放器内核,原生MediaPlayer可以自由切换 对于视图状态切换和后期维护拓展...这个每个实现类则都可以拿到这些属性呢 在BaseVideoController中使用LinkedHashMap保存每个自定义view视图,添加则put进来后然后通过addView将视图添加到该控制器中,...然后需要在初始化配置视频播放器的时候,将这个实现类的对象传递进来即可。通过这个配置类传进来的对象,播放器就可以处理监听设置逻辑呢。

2.7K00
  • 企鹅FM(Android) 播放成功率从 2 个 9 到 3 个 9 的蜕变

    第二次是3.7版本,使用了Google的开源播放器内核ExoPlayer替换了腾讯视频SDK,到目前最新的3.8版本,点播成功率已经优化到99.9%,HLS直播成功率优化到99.2% 最近半年包括更换...,在播放器内核外围的逻辑层 换ExoPlayer与奥卡姆剃刀 常做优化的同学肯定很清楚,越是小数点后面的9,越来之不易,90%到99%再到99.9%,这其中的困难可以说是指数上升的。...于是当发现ExoPlayer能够很完善解决这两个问题的时候,我们就进行了替换 得益于ExoPlayer高度可扩展的特性,我们去除了本地代理模块,将分片加载和缓存以及音频的变速和特效处理模块直接集成进来...其他的补充手段 仅仅靠换播放器内核和重新设计业务逻辑接入是没法做到极致的,这里还针对点播和广播(HLS)做了一些额外的优化 ExoPlayer是通过抛异常来上报各种播放错误的,起初我们把全部的异常都算在播放错误中...,如果不关闭前一个正在进行的连接有可能导致大量连接堆积会耗尽socket或者是Http连接池中的资源 针对播放HLS中的BehindLiveWindow异常进行一定次数重试,该问题通常是资源问题或者连接太慢导致

    3.9K01

    可折叠设备的桌面模式

    这是一个简单的媒体播放器案例,它会自动调节尺寸以避免让折叠处出现在画面中间,并且调整播放控制组件的位置,从屏幕完全展开时嵌入画面中,变为当屏幕部分折叠时显示为单独的面板。...MotionLayout 结合了父类的灵活性,同时又具备在视图从一种姿态过渡到另一种时展示流畅动画的能力。...implementation 'androidx.window:window:1.0.0-beta01' ... } 布局 首先考虑视频播放器 Activity 的布局,其根元素是包含了三个子视图的...第三个视图是一个 ReactiveGuide。它被放置在另外两个视图中间,并且以 Guideline 的形式作为另外两个视图的划分。...intersects ) { return null } // 将显示特征坐标偏移至视图坐标空间起始点 featureRectInView.offset

    2.4K30

    如何处理手势冲突 | 手势导航连载 (三)

    这里让我们回到之前提到的音乐播放器示例。它包含一个位于屏幕底部的进度条,允许用户快进和快退歌曲。...,将进度条向上推到手势区域之外。...但是在上面的修改后,进度条下方有很多空间被浪费掉了,使得 UI 在外观上的完成度下降。...因此,除了直接修改视图的边距,我们还可以修改布局,以避免出现空间浪费: △ 将进度条移到视图的顶部 在这里,我们将进度条移到了播放控件的顶部,完全移出了手势交互区域。...View API 会帮您解决坐标空间之间换算的问题。 让我们再次回到之前提到的音乐播放器示例,我们现在把播放进度条挪到了控件上方,并且撑满了整个屏幕宽度。

    5K30

    基于ExoPlayer的ExoPlayerVideoView

    但是MediaPlayer的api实在是但太难用了,扩展性也不好。所以我们可以用诸如ijkplayer,VLC以及ExoPlayer。...本文并不是讲述ExoPlayer如何使用的,而是一款基于ExoPlayer的VideoView。ExoPlayerVideoView旨在提供一个快捷的视频播放布局的解决方案。 概览 ? 亮度调节 ?...音量 开始 ExoPlayerView 是一个基于ExoPlayer的视频播放器,并且做了很多封装。...); 注意:不要忘记释放ExoPlayer: videoView.releaseSelfPlayer(); 可以通过如下方式为视频设置一个显示名称: mediaSource.setDisplayName....如果返回的是false 并且你设置了一个非空的OrientationListener, ExoVideoView 如果处于横屏,ExoVideoView将尝试变回竖屏并调用OrientationLister.onOrientationChange

    4K30

    Android 实现视屏播放器、边播边缓存功能、外加铲屎(IJKPlayer)

    基于FFMPEG,支持Android与IOS,还封装了谷歌亲儿子MediaPlayer与干儿子EXOPlayer(为什么要用EXO),支持直播流,Star-9000多与fork-3000的视频播放器你支持安利...‘ 这里我们要实现IjkMediaPlayer的播放接口,监听IjkMediaPlayer的相关状态回调然后封发到各个逻辑播放器中。从下方代码可以看到,真的和MediaPlayer好像。 ?...判断触摸的是进度条还是界面,如果是界面判断是左右滑动就显示Dialog并seekTo,如果是上下就根据屏幕的左边还是右边来选择是调节音量还是亮度。...IJKPLAY库里还封装了exoplayer谷歌干儿子,用法也基本一致,这个播放器自己内部判断旋转,不会有上面的seekto问题,可是后台或者onPause之后的画面恢复速度堪忧啊,各位遇到过吗?...( ‵o′)凸 拖动进度条,需要在停止拖动的时候,判断视频是不是已经播放完了被释放了。

    3K90

    【程序源代码】视频播放器

    关键字: 视频播放器(IJKplayer、ExoPlayer、MediaPlayer),HTTPS支持,支持弹幕,支持滤镜、水印、gif截图,片头广告、中间广告,多个同时播放,支持基本的拖动,声音、亮度调节...,支持边播边缓存,支持视频本身自带rotation的旋转(90,270之类),重力旋转与手动旋转的同步支持,支持列表播放 ,直接添加控件为封面,列表全屏动画,视频加载速度,列表小窗口支持拖动,动画效果,...调整比例,多分辨率切换,支持切换播放器,进度条小窗口预览,其他一些小动画效果,rtsp、concat、mpeg。...安装说明 安装前先做一些准备工作: 1、开发需要准备相关的 IDE和JDK8 开发环境 , 后端开发需要下载Eclipse 或 IDEA。...2、数据库准备,创建一个 名称为 的数据库,把跟目录下 .sql数据库文件进行导入 3、导入工程源码,创建工程。启动

    3.8K10

    一个ExoPlayer原生播放问题引起的思考

    ExoPlayer的原生问题,我们赶紧找到ExoPlayer的源码: https://github.com/google/ExoPlayer/blob/release-v2/library/extractor...continuity_counter 4b 递增计数器,从0-f,起始值不一定取0,但必须是连续的 已经规定好了每一个TS Packet大小是188字节,识别TS Packet大小的重要标志是读sync_byte...但是,制定的标准,有的遵守标准,有的不一定遵守标准。真的发生的标准不遵守怎么办?...定制化修改ExoPlayer源码,适配这种异常的类型。 第一种难度可能要点高,不太现实,毕竟让服务方给你改东西,人接不太原因。那就只好播放器去适配,播放器将这个校验去掉有没有问题?...从对TS格式分析来看,这样的修改不太完美,但是从播放器的兜底处理来看,这样的处理基本没有风险。因为最坏的结果就是播放失败。已经有兜底方案了,应该没有问题。 制定了标准,总有人不去遵守。

    3.5K20

    Android 实现视屏播放器、边播边缓存功能、外加铲屎(IJKPlayer)

    (issues 600多算活跃吗┑( ̄Д  ̄)┍) 集成工作还是有定的工作量的,它的DEMO肯定满足不了欲求不满的设计狮和产品汪的,这里我们不跑分,不打广告,不讲原理,只求站在巨人的肩膀上学(cao)习...‘ 这里我们要实现IjkMediaPlayer的播放接口,监听IjkMediaPlayer的相关状态回调然后封发到各个逻辑播放器中。从下方代码可以看到,真的和MediaPlayer好像。...判断触摸的是进度条还是界面,如果是界面判断是左右滑动就显示Dialog并seekTo,如果是上下就根据屏幕的左边还是右边来选择是调节音量还是亮度。...3、IJKPLAY库里还封装了exoplayer谷歌干儿子,用法也基本一致,这个播放器自己内部判断旋转,不会有上面的seekto问题,可是后台或者onPause之后的画面恢复速度堪忧啊,各位遇到过吗?...( ‵o′)凸 5、拖动进度条,需要在停止拖动的时候,判断视频是不是已经播放完了被释放了。

    2.7K30

    02.视频播放器整体结构

    如何友好处理播放器UI 08.交互交给外部开发者 09.关于优先级视图展示 10.代码项目lib代码介绍 00.视频播放器通用框架 基础封装视频播放器player,可以在ExoPlayer、MediaPlayer...,左右滑动快进和快退视图(手势滑动的快进快退提示框) 顶部控制区视图(包含返回健,title等),底部控制区视图(包含进度条,播放暂停,时间,切换全屏等) 锁屏布局视图(全屏时展示,其他隐藏),底部播放进度条视图...(很多播放器都有这个),清晰度列表视图(切换清晰度弹窗) 底部播放进度条视图(很多播放器都有这个),当bottom视图显示时底部进度条隐藏,反之则显示 02.后期可能涉及的视图 手势指导页面(有些播放器有新手指导功能...,分享,切换音频等) 03.需要达到的目的和效果 基础封装视频播放器player,可以在ExoPlayer、MediaPlayer,声网RTC视频播放器内核,原生MediaPlayer可以自由切换 对于视图状态切换和后期维护拓展...比如播放中需要更新UI进度条,播放异常需要显示异常UI,都比较难处理播放器状态变化更新UI操作 UI难以自定义或者修改麻烦 比如常见的视频播放器,会把视频各种视图写到xml中,这种方式在后期代码会很大,

    1.8K10

    音视频全链路技能分析之音视频消费侧技能树

    建议看下我之前的一篇分析文章:Ijkplayer、ExoPlayer、VLC播放器综合比较,视频播放器很多种,但是从根上面来讲的话,原理都是一直的。...加载控制: 播放器播放视频会加载数据,有一定的加载策略的,以ExoPlayer而言,LoadControl就是ExoPlayer的加载控制策略接口,原理就是已加载的buffer size设置在 Min...(canvas)此视图,那么上传的这张canvas将替换原来的frontCanvas作为新的frontCanvas,原来的frontCanvas将切换到后台作为backCanvas。...例如,如果你已经先后两次绘制了视图A和B,那么你再调用lockCanvas()获取视图,获得的将是A而不是正在显示的B,之后你将重绘的C视图上传,那么C将取代B作为新的frontCanvas显示在SurfaceView...后续的分享的主题是:ExoPlayer原理剖析、自定义播放器实现、ijkplayer原理剖析、播放器性能优化专项。

    1.6K30

    ExoPlayer 多路流切换

    双播放器切换: 这种是一种相对来说比较原始的方案,正在播放的过程中,启动一个新的播放器播,并且将渲染画布alpha设置为透明,同时新的播放器Seek到比当前播放器播放位置更靠前的地方,直到播放位置大概相同时切换画布透明度...重启播放器切换: 无论双播放器还是双解码器切换显然存在维护成本过高的问题,一种可行的方法,就是重启播放器,并Seek到当前播放点,这个过程相当于重播+Seek。...这种播放器只能使用重启播放器方式实现码流切换。ExoPlayer作为开源播放器,具备很好的可扩展性,既支持DASH/HLS切换,同时也支持解码器重启方式的切换。...3.3 MediaPlayer是否支持多路流 不支持,也没法切换 3.4 ExoPlayer如何将多路流输入到播放器中?...4.2 对齐结果补充 4.2.1 音频和视频对齐共同点: 音频和视频对齐时各自的渲染器都可能会有轻微的跳帧现象,当然这些调整和卡顿感也和IO速度、CPU负载网速也有一定的关系,磁盘、CPU运行效率越高,

    1.4K31

    01.视频播放器框架介绍

    左右滑动快进和快退视图(手势滑动的快进快退提示框) 顶部控制区视图(包含返回健,title等),底部控制区视图(包含进度条,播放暂停,时间,切换全屏等) 锁屏布局视图(全屏时展示,其他隐藏),底部播放进度条视图...比如播放中需要更新UI进度条,播放异常需要显示异常UI,都比较难处理播放器状态变化更新UI操作 UI难以自定义或者修改麻烦 比如常见的视频播放器,会把视频各种视图写到xml中,这种方式在后期代码会很大,...这个每个实现类则都可以拿到这些属性呢 在BaseVideoController中使用LinkedHashMap保存每个自定义view视图,添加则put进来后然后通过addView将视图添加到该控制器中,...然后写一个播放器视图接口的具体实现类,在这里里面inflate视图操作,然后接口方法实现,为了方便后期开发者自定义view,因此需要addView操作,将添加进来的视图用map集合装起来。...这个在sdk中特别常见,因此该库一定程度是借鉴腾讯播放器…… 视频框架:https://github.com/yangchong211/YCVideoPlayer

    2.7K51

    Android ExoPlayer 音画同步代码分析

    【3】视频丢帧&视频等待对齐 这种方式一般是常见的主流播放器实现方式,以音频控制时间为准,目前主流的播放器如MediaPlayer、ExoPlayer、iJkPlayer都是这种实现,视频快则走方案【2...resume、pause处理,因此在调用resume和pause之前,恢复到原有的速度 三、ExoPlayer 音画同步分析 回到本文主题,我们来分析一下ExoPlayer的音画同步方式,以便利用这种机制实现一些场景下的多播放器同步...和主流播放器一样,ExoPlayer也是以音频为准的同步方式,本文将一步一步解释说明。...如果超过一定的限值,即该视频帧来得太晚了,则将这一帧丢掉,不予显示。...在有些业务中的音频输出和ExoPlayer是分开的,我们要考虑如何通过音频播放器去同步ExoPlayer中的视频渲染器,但有ExoPlayer具备高度的可扩展性,我们可以通过自定时钟的方式去同步ExoPlayer

    1.5K20

    看点视频秒开优化:解码器复用优化方案篇

    受到Google ExoPlayer优化切换清晰度时耗时的方案启发(具体可见《Improved decoder reuse in ExoPlayer》),解码器可以在一定条件下不经过重启,直接播放不同清晰度的视频...ExoPlayer是一种播放器内部解码器复用方案,即解码器和播放器实例绑定。对于不同分辨率的视频A、B、C,下次播放时判断该播放器实例是否可以复用,如果可以,进行复用,否则重新初始化解码器。 ?...保证解码质量:由于解码器复用比较偏向系统底层,而Android上机型众多,需要用一定的手段来解决兼容问题保证解码质量。...要实现通用方案,并且所有基于MediaCodec的播放器可用,需要对MediaCodec的API进行hook并且将复用逻辑与播放器隔离。...,也可以很好的将复用逻辑和外部隔离,也有较低的入侵性。

    6.1K126

    ExoPlayer播放音视频的使用介绍

    ExoPlayer是专门为此设计的,并允许将许多组件替换为自定义实现。 能够使用官方扩展快速集成多个附加库。...ExoPlayer实现不是直接实现媒体的加载和渲染,而是将这项工作委托给创建播放器或准备播放时注入的组件。...将播放器添加到view (用于视频输出和用户输入)。 准备播放器与MediaSource播放。 完成后释放播放器。 这些步骤在下面更详细地概述。...将播放器绑定到view很简单,代码如下: // 将播放器附加到view playerView.setPlayer(player); 如果您需要对播放器控件和渲染视频的Surface进行更详细的控制,则可以分别使用...您可以将PlayerControlView作为独立组件使用,或者实现您自己的播放控件,直接与播放器交互。

    6.5K20

    音视频开发之旅(45)-ExoPlayer 音频播放器实践(一)

    通过上一篇的学习实践,我们了解了ExoPlayer的优缺点以及基本用法,今天我们进入ExoPlayer的音频播放实践,我们来一起实现一个简单的音频播放器。...通过将音频应用程序的两个部分分解为单独的组件,每个组件可以独立运行。与播放器相比,UI通常是短暂的,可能会在没有UI的情况下运行很长时间。...也包含媒体播放器实例(比如我们本篇实践的ExoPlayer) MediaSession 一般在MediaBrowserService的onCreate中创建,通过MediaSession.CallBack...Activity直接和Service通过MediaSession框架中的各种回调进行通信,播放器ExoPlayer封装在Service内,数据的获取也在Service中。...框架实现简单的音频播放器(播放/暂停、切歌、倍速) 了解原理、具体实践以及流程分析,我们基本了解MediaSession的框架以及ExoPlayer简单实用。

    5.4K00

    音视频开发之旅(44)-ExoPlayer介绍及简单使用

    从这篇开始我们进入阶段五 —— 一些音视频开源项目的学习使用分析,今天我们进入ExoPlayer部分的学习实践 一、ExoPlayer基本介绍 1.1 ExoPlayer优缺点 ExoPlayer是谷歌开源的一个应用级的音视频播放器...1.2 ExoPlayer架构设计 ExoPlayer的核心是ExoPlayer的接口,其中定义了包涵传统播放器的功能(缓冲音视频、播放、暂停、seek等)。...ExoPlayer没有设定可以播放的媒体类型、存储方式以及渲染方式,也没有直接实现加载和播放。而是在播放器被创建或者准备播放时将这些工作代理给注册的组件来实现。...,播放器停止播放或者播放失败后也会处于该状态 STATE_BUFFERING: 没有足够的数据可以加载播放,此时无法立即播放 STATE_READY : 播放器可以立即播放,是否播放取决于playWhenReady...ExoPlayer,实现一个简单的音频播放器,欢迎关注公众号“音视频开发之旅”,一起学习成长。

    7.9K00

    YouTube开源播放器中文使用指南

    壹·前言 在这之前笔者使用原生的MediaPlayer、B站开源的IJKVideoView等播放器。直到发现ExoPlayer,这款由YouTube开发的播放器真的是非常强大。...对于自定义播放器非常友好,里面将很多模块抽象成独立的组件可供使用者自行定制,当然官方也提供了一些默认的实现。如果你正在开发视频类功能,强烈推荐你尝试一下ExoPlayer。...支持大部分流媒体格式,并且对DRM的支持也比较友好,比如下方就是官方提供的支持的设备情况: 用例 Android版本号 Android API Level Audio Playback 4.1 16 Video...的使用 我们只要按照下面的步骤就能简单的将ExoPlayer使用起来了: 1、添加对ExoPlayer库的依赖 2、创建一个SimpleExoPlayer实例 3、将播放器关联到播放渲染的View上...我们可以参考官方的API说明:官方文档 释放播放器 当我们不再使用播放器的时候,将手机有限的资源进行释放是非常的必要的。

    4K20
    领券