构建一个Android视频播放器应用(2/5)

原文地址:https://medium.com/google-developers/building-a-video-player-app-in-android-part-2-5-e5a5392879fa

本系列文章的目标是让您开始使用ExoPlayer构建简单但功能丰富的视频播放器应用程序(支持播放列表,MediaSession,音频聚焦和画中画)
本系列的第一篇文章介绍了创建ExoPlayer实例所需的步骤,并将其附加到应用的UI以允许视频播放。还介绍了如何将ExoPlayer如何跟Activity连接,本文将介绍如何通过连接MediaSources创建播放列表,并向您展示如何自定义ExoPlayer播放控制UI。

创建播放列表

你可以创建一个DynamicConcatenatingMediaSource,里面可以包含任意数量的MediaSource对象,下面是示例:

val mediaMap  = mapOf<SourceType, Uri>(
  local_audio to Uri.parse("asset:///audio/file.mp3"),
  local_video to Uri.parse("asset:///video/file.mp4"),
  http_audio to Uri.parse("http://site...file.mp3"),
  http_video to Uri.parse("http://site...file.mp4")
)

enum class SourceType {
  local_audio,local_video,http_video,http_audio,playlist;
}

fun buildMediaSource(sourceType: SourceType): MediaSource{
  return when(sourceType){
    playlist -> {
      return DynamicConcatenatingMediaSource(
        createExtractorMediaSource(local_audio),
        createExtractorMediaSource(local_video),
        createExtractorMediaSource(http_audio),
        createExtractorMediaSource(http_video),
      )
    }
    else -> {return createExtractorMediaSource(sourceType)}
  }
}

private fun createExtractorMediaSource(sourceType: SourceType): MediaSource{
  return ExtractorMediaSource.Factory(
    DefaultDataSourceFactory(mContext, "exoplayer-learning").createMediaSource(mediaMap.get(sourceType))
  )
}

DynamicConcatenatingMediaSource创建一个动态的播放列表,如果你想创建一个静态的播放列表可以使用ContactenatingMediaSource,他们将无缝整合媒体资源并处理整个播放列表的缓冲区。要详细了解MediaSource的组成细节,请阅读本文

定制UI

为了使用ExoPlayer查看应用程序加载的视频内容,您必须将PlayerView添加到创建ExoPlayer实例并加载媒体的Activity中。您可以将此视图附加到ExoPlayer实例,方法是将您的ExoPlayer实例分配给PlayerView的播放器属性。
以下是一个显示PlayerView的Activity的布局XML示例。具有“app:”命名空间的属性允许您将配置参数传递给视图,以便您可以根据自己的喜好自定义其行为。您可以控制视频快进或快退等增量(以毫秒为单位)。可以在ExoPlayer javadocs.中查看所有的属性列表。

<com.google.android.exoplayer2.ui.PlayerView
    ...
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/exoplayerview_activity_video"
    app:use_artwork="true"
    app:default_artwork="@drawable/loading"
    app:show_timeout="5000"
    app:fastforward_increment="10000"
    app:rewind_increment="10000"
    app:controller_layout_id="@layout/custom_playback_control_minimal" />

除非你使用app:use_controller="false"来禁用控制器,PlayerView自动回显示媒体控制器UI,允许用户播放,暂停或者下一个等操作,通过在show_timeout属性中设置超时值,您可以自定义该控制器显示自动隐藏之前的时间。

为了定制控制器UI本身,有一个属性“controller_layout_id”,它允许我们选择一个布局文件,其中包含对控制器UI本身的任何定制。这是一个例子。

<LinearLayout 
    ...
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_gravity="center"
    android:background="@#CC000000"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:paddingTop="4dp"
        android:orientation="horizontal">

        <ImageButton
            android:id="@id/exo_prev"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_gravity="center"
            style="@style/ExoMediaButton.Previous" />

        <ImageButton
            android:id="@id/exo_play"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_gravity="center"
            android:tint="#cc63c866"
            style="@style/ExoMediaButton.Play" />

        <ImageButton
            android:id="@id/exo_pause"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_gravity="center"
            android:tint="#ccc76185"
            style="@style/ExoMediaButton.Pause" />

        <ImageButton
            android:id="@id/exo_next"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_gravity="center"
            style="@style/ExoMediaButton.Next" />

    </LinearLayout>

</LinearLayout>

这会产生一个媒体控制器用户界面,其外观与下图类似,UI控制器覆盖在PlayerView上面,您可以添加或删除播放,暂停,后退,跳过等按钮。而且ExoPlayer之所以知道你使用的是你的组件而不是默认的组件是因为你使用了ExoPlayer自身提供的ID作为播放按钮,暂停按钮或跳到下一个按钮等等。 为了了解更多关于定制PlayerView和UI控制器的信息,请阅读这篇文章
[图片上传失败...(image-e3146f-1522149400846)]

监听播放器的播放事件

ExoPlayer通过ExoPlayer.EventListener接口提供了许多有价值的信息。你可以实现这个接口或者他的子类ExoPlayer.EventListener,以便在播放器状态更改时获得通知。另外,你可以实现VideoRendererEventListenerAudioRendererEventListener获得更多的关于音频和视频呈现的更多细节。

这一系列的文章不会覆盖太多的监听ExoPlayer的细节,如果想深入了解更多关于ExoPlayer的时间监听,可以去查看ExoPlayer codelab,如果想对检测播放器缓冲,暂停或实际播放媒体更深入的了解,请参阅此文章

自适应流

ExoPlayer不仅支持从APK和网络加载媒体文件,而且还支持自适应的流,自适应流媒体将视频和音频文件分割成给定持续时间的小块,然后ExoPlayer将他们拼接在一起进行播放,这些块中的每一块都可能具有不同的质量(大小或比特率),播放器可以根据设备功能和可用网络带宽选择每个块的质量。如果有更多带宽可用(例如,从低速移动网络切换到快速WiFi网络),播放器将从低质量块开始,然后切换到更好的块。
您可以在本MDN文章
中了解有关HLS(HTTP实时流式传输),MPEG-DASH(基于HTTP的动态自适应流式传输)和SmoothStreaming的更多信息。要详细了解DASH和HLS之间的差异,请在ExoPlayer博客上查看本文

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,738评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,377评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,774评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,032评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,015评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,239评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,724评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,374评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,410评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,457评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,132评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,733评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,804评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,022评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,515评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,116评论 2 341

推荐阅读更多精彩内容

  • 上课的时候 无聊 左喵右喵 同学的屏幕亮着 突然 正襟危坐 然后 眼珠子 不自觉地撇向那边 ...
    粘满芥末的糖阅读 136评论 0 0
  • 最近加班加到做梦都在工作,工作。 所以最近我的口头禅如下, 什么时候1=1.5 OT的时候 什么时候1=3 ...
    小魔女张张阅读 413评论 0 0
  • 姓名:张汉超 公司:东莞耀升机电有限公司 组别:4月25-27日六项精进245期学员 【日精进打卡第192天】 【...
    张汉超阅读 120评论 0 0