字幕组成品列表(Beta)
  • 写在前面
  • Android 平台
    • Game On! 游戏开发系列 - 031
      • Pie Noon - 1503060393
      • The Death of Base Game Activity - 1504030543
      • Surviving OpenGL Context Loss - 1504030546
      • WebP for Game Devs - 1504030547
      • Saved Games In-Depth (Part 1) - 1504070556
      • Saved Games In-Depth (Part 2) - 1504030548
      • Smaller Flipbook Textures with CRABBY - 1504030544
      • Google Tag Manager - 1504030545
      • Flatbuffers - 1505050794
      • Achievement Point Pointers - 1505050796
      • Frequency Scaling - 1505050797
      • Meet the Management APIs - 1501140367
      • Y U Ship Broken Games - 1505050795
    • Android 性能优化 - 088
      • Garbage Collection in Android - 1503170425
      • Performance Cost of Memory Leaks - 1503170424
      • Rendering Performance 101 - 1501130351
      • Understanding Overdraw - 1501130352
      • Understanding VSYNC - 1501130353
      • Tool - Profile GPU Rendering - 1501130354
      • Why 60fps? - 1501130355
      • Android UI and the GPU - 1501130356
      • Invalidations, Layouts, and Performance - 1501130357
      • Overdraw, Cliprect, QuickReject - 1501130358
      • Tool - Memory Monitor - 1501130363
      • Battery Performance 101 - 1501130364
      • Understanding Battery Drain on Android - 1501130365
      • Battery Drain and WakeLocks - 1501130366
      • Memory Performance 101 - 1504170661
    • I/O 2014 Android 开发专题 - 089
      • Activity Transitions - 1504020505
      • Building Apps For Android TV - 1504020520
      • Building great Android media experiences - 1504020510
      • Building a quality app from start to finish - 1504020515
      • App Indexing API - 1504020507
      • What's new in WebView - 1504010484
      • Bluetooth Low Energy - 1504010486
      • Building impressive Android media experiences - 1504010493
      • The next Generation of Authentication - 1504020497
      • Don't Alpha That Pixel! - 1504020523
      • NFC + HCE Your phone in an interactive world - 1504020509
      • Demystifying encodes and decodes of WebM - 1504020521
      • Google Cloud Messaging - 1504020524
      • Getting your Game on the Big Screen - 1504020518
      • I hear you like realtime memes - 1504020511
      • Offerize your App - 1504020506
      • Using the Android Job Scheduler - 1504020504
      • From Holo to Material - 1504020526
      • Under the Hood of Android Auto - 1504020501
      • Isolation for Android App Developers - 1504020498
      • Android Work - 1504010496
      • ExoPlayer: Adaptive video streaming on Android - 1504010489
      • Sample rates and resampling: Why can't we all just agree? - 1504010488
      • Drive Android API - 1504010485
    • Android Studio - 004
      • Layout Editor (Ep 3, Android Studio) - 1503290479
      • Introducing Gradle (Ep 2, Android Studio) - 1503170426
    • I/O 2014 Android 分发主题 - 091
      • Introduction to Google Play - 1504030534
      • Google Play: building your user community - 1504030535
      • Optimizing Apps for Education - 1504030536
      • Succeeding in Education Technology - 1504030530
      • Subscriptions Made Easy with Google Play - 1504030531
      • The world is your playground - go global with Google - 1504030533
      • Maximizing discoverability on Google Play - 1504030538
    • Android Auto - 003
      • Introduction to Android Auto - 1504130615
      • Android Auto Messaging - 1504130617
      • Android Auto Audio - 1504130616
    • Android Wear - 006
      • Designing for Android Wear - 1503210448
      • How We Customized Google Apps for Android Wear - 1503210450
      • Fullscreen apps for Android Wear - 1503210445
      • New Notification Features for Android Wear - 1503210446
      • Building Cloud-powered wearable Apps - 1503210449
      • An Introduction to Android Wear - 1503190435
      • Google I/O 2014 - Android Wear: The developer's perspective - 1503210442
      • Devoxx 2014 Interviews: Android Wear - 1503210440
      • DevBytes: Watch Faces for Android Wear - 1503210439
    • Android TV - 005
      • Using the Leanback library - 1504080588
      • Beach Buggy Racing Multiplayer with Nearby Connections (Play Services) - 1503060387
    • Android for Work - 106
      • Android for Work for Developers - 1503060390
      • App Configurations, Testing and Launchers - 1504110590
    • IO Bytes 2014 - Android - 066
      • Chrome Apps on Android and iOS - 1501080014
      • Perf Primer CPU, GPU and your Android game - 1501080017
  • Chrome 平台
    • IO Bytes 2014 - Chrome and Web - 067
      • Using the PageSpeed API - 1505070815
      • Fabulous Forms for the multi-device web - 1505070816
      • Testing multi-screen web pages - 1505070817
      • Responsive images today - 1505070819
      • Web Performance Testing at YouTube - 1505070828
      • Building sites for the multi-device web - 1505070820
      • Deep dive: Google Cloud Messaging for Chrome - 1505070827
  • Google 创业者资源
    • Coffee with a Googler - 012
      • Chat with Allen Huang of AndroidTV - 1503040384
      • Chat with Fred Chung about developer advocacy - 1503070395
      • Google Fit platform with Michelle Haq - 1503210443
      • Android Auto Product Manager Andrew Brenner - 1501120027
      • Chat with Francis Ma about Google Play services - 1501120028
    • Root Access For Startups - 077
      • What we learned building plug-ins for Android, with startup Magnet - 1503230453
      • How to use crowdfunding to your advantage, with startup Hale Devices - 1503280462
      • How to overcome customer objections when selling tech, with startup Guesswork - 1503280458
    • First Things First - 029
      • Getting started with Android: A crash-course in developing for Android - 1504120601
      • How to ask a question: conducting research for your startup - 1504120603
      • MVP Design Hacks: transform your hot idea into a validated prototype - 1504120602
      • Build something people want: Solving real problems - 1504120605
    • How I - 061
      • Use BigQuery to find my most valuable customers - 1504070573
      • Manage beta testing communities using Google Play - 1504070572
      • Use paper wireframing to build native prototypes - 1504070570
      • Used social media and $0 marketing to get 68 million users - 1504070568
      • Prep to fundraise with four questions - 1504070564
      • Validated my idea in 2 days (with no code) - 1504070562
      • Build open platforms on Android - 1504120596
      • Get cheap, automatic analytics for my business using BigQuery - 1504070571
      • Write press releases to get international media coverage - 1504070569
      • Test beta-product features using Google Apps - 1504070563
      • Use URL builder to measure ROI on social media - 1504070561
      • Use events to build DeadSocial's brand - 1504070557
      • Use BigQuery to visualize streaming data - 1503220452
      • Find, screen, and hire developers - 1503120406
      • Drive engagement with social challenges - 1504070558
  • 设计
    • DesignBytes - 017
      • Paper and Ink: The Materials that Matter - 1505050793
  • 云计算
    • DevBytes: Google Cloud Platform - 021
      • Powering the next killer app with the Google Cloud Platform - 1504210672
      • Introduction to Google Cloud Endpoints - 1504210675
      • The Beauty of Scale with Google Cloud Platform - 1504210678
    • Google Cloud Platform - Big Data - 105
      • GDELT & BigQuery: Understand the world - 1502200379
    • Uncategorized - 999
      • Introducing Google Cloud Platform Resources - 1501190370
  • Google 应用开发
    • Launchpad Online - 072
      • The Setup: Creating new apps using Google APIs - 1503190428
      • Listing your files in Google Drive - 1503190429
      • Customizing Google Analytics for your startup - 1503290473
      • The Launchpad Online series - 1503190427
      • Getting started with Google Analytics - 1503290472
      • Accessing Google Maps from a spreadsheet?!? - 1502220381
      • Change the world in 10 lines of code - 1503080398
    • Google Play Services - 054
      • Google Play services 6.1 - 1503290481
      • Google Play Services 7.0 - 1503200437
      • Google Play Services 6.5 - 1501080015
    • 谷歌地图 iOS SDK - 053
      • Maps Live: New Features in the Google Maps Mobile APIs for Android and iOS - 1504300777
    • Google 移动搜索开发 - 055
      • Is your app in the Google index? - 1504120598
      • Get more engaged users with Google Search for Developers - 1503070397
    • DevBytes: Google Cast - 020
      • Google Cast SDK for Android - 1504180666
      • Media Router Framework - Part 1 - Media Router API - 1504180667
      • Overview for Google Cast Receivers - 1504180664
      • Google Cast SDK for iOS - 1504180663
    • Getting Started with the Google Maps SDK for iOS - 035
      • Getting started with the Google Maps SDK for iOS, Part 1 - 1504270757
    • IO Bytes 2014 - Wearables - 070
      • Voice Driven GDK Glassware - 1505280836
    • Route 85 - 078
      • Introducing Route 85 - 1501120022
      • Quick Tip: Don't Default that Switch! - 1501190371
      • OpenInChrome on iOS, Part 1 - 1501120023
      • OpenInChrome on iOS, Part 2 - 1501120024
      • OpenInChrome on iOS, Part 3 - 1501120025
      • OpenInChrome on iOS, Part 4 - 1501120026
    • DevBytes 2014 - 019
      • Web Components - Template - 1505040789
      • Wearable DataLayer API - 1505050792
      • Using srcset for responsive images - 1505050790
      • The picture element for art direction - 1505050791
    • Uncategorized - 999
      • Sun Surveyor brings augmented reality to photographers using Google Maps APIs - 1504200668
      • Snappy travels with the Roads API - 1503060392
      • Easy Maps Apps in Java and Python - 1501140030
  • Google 广告平台
  • Polymer
    • Polycasts - 076
      • The Awesome Power of Auto-Binding Templates -- Polycasts #08 - 1502220382
      • Content Switcheroo with Core-Pages -- Polycasts #09 - 1502200380
      • Core Iconset -- Polycasts #02 - 1505040788
  • Web 平台
    • HTTP 203 - 062
      • Gotchas - 1501140368
      • Font Rendering - 1501080016
    • Web Components - 081
      • DevBytes: Web Components - Overview - 1504250709
  • 宣传视频
    • Uncategorized - 999
      • Google Developers - 1501150369
      • I/O Extended 2014 - Join me - 1502220383
  • Google 各类开发者会议
    • 2014 Chrome 开发者高峰会议 - 009
      • Keynote - Chrome Dev Summit 2014 (Darin Fisher) - 1503120407
      • TLS All the Things! - Security with Performance(Chris Palmer) - 1503140412
      • Let’s build some apps with Polymer!(Rob Dodson) - 1503150415
      • Day One Closing Remarks(Sundar Pichai) - 1503150417
      • Chrome Leadership panel - 1503160422
      • Fundamentals of Mobile Web Development(Matt Gaunt) - 1503150416
    • 2015 游戏开发者大会中 - 039
      • FlatBuffers - 1504150640
      • Games for Google Cast - 1504150637
      • Top 10 Things Android Game Developers Should Know v 3.0 - 1504150643
      • Automate Publishing for Google Play APIs - 1504150639
      • 3 Game Design Mistakes You're Making - 1504150636
      • Android TV - 1504150638
      • How to Go Viral Without Really Trying - 1504150641
    • Devoxx 2014 Interviews - 024
      • What's new in Android 5.0 Lollipop - 1504260740
      • Android Tools - 1504260743
      • BigQuery and user-defined functions - 1504260744
    • IO Bytes 2014 - 065
      • Dart in Google Cloud - 1505070810
      • Big genomic data on Google Cloud Platform - 1505070811
      • Easy International Checkout with Chrome - 1505070802
      • Google developer tools and APIs for iOS - 1503190436
      • Whet your appetite with IO Bytes - 1501080021
    • PlayTime@Shanghai - 095
      • 主题演讲 Chris Yerga - 1504060549
      • 如何成功地开发你的应用 Ellie Powers - 1504060550
      • 在Google上营利 Brahim Elbouchikhi - 1504060551
      • Playtime Shanghai event sizzle reel - 1504070552
    • Project Google I/O 2015 - 098
      • Project Tango Mobile 3D tracking and perception - 1506120857
      • Democratizing Education - 1506120868
      • Improve your Android app’s accessibility - 1506120864
      • Google Cloud Messaging 3.0 - 1506120844
      • Developers connecting the world through Google Play - 1506120862
  • 开源开放技术
    • Compressor Head - 013
      • The Trailer, Season 2 - 1503060385
      • Behind the Scenes - 1503210441
      • Arithmetic Compression (Ep 5, Compressor Head) Google - 1503070394
      • Introducing Compressor Head - 1502120372
      • Episode 1 (Variable Length Codes) - 1502120373
      • Episode 2 (The LZ77 Compression Family) - 1502120374
      • Episode 3 (Markov Chain Compression) - 1502120375
Powered by GitBook
On this page
  • 译者信息
  • 解说词中文版:

Was this helpful?

  1. Android 平台
  2. I/O 2014 Android 开发专题 - 089

ExoPlayer: Adaptive video streaming on Android - 1504010489

PreviousAndroid Work - 1504010496NextSample rates and resampling: Why can't we all just agree? - 1504010488

Last updated 5 years ago

Was this helpful?

视频发布时间

2014年6月25日

视频介绍

ExoPlayer is a newly open sourced media player built on Android's low level media APIs. It supports DASH and SmoothStreaming adaptive playback, and is used by Google's YouTube and Play Movies applications. This talk discusses the design of ExoPlayer, its use of Android's low level media APIs, and how you can use, extend and customize ExoPlayer in your own video applications.

视频推介语

暂无,待补充。

译者信息

翻译

润稿

终审

原始链接

中文字幕

翻译流水号

加入字幕组

伍文其

Wallace4ever

--

1504010489

解说词中文版:

嗨

我是Ollie,来自Android团队

我想给大家介绍一下ExoPlayer ,一个应用级的

Android媒体播放器

由于建立在Android的底层的媒体的API之上,

ExoPlayer带来了了许多优越特性

甚至超过了Android的内置媒体播放器

你将很高兴地听到它同时支持

动态自适应http流媒体和流畅的流的播放

在Google 我们已经在YouTube中

使用ExoPlayer并用它来播放电影

现在我们正把它开源,以便于

你们也能在你们自己的应用中使用它

我将向你们展示创建ExoPlayer所需的更底层的API

它展现出应用级别的媒体播放器的优点

并告诉你如何将ExoPlayer

集成到自己的应用程序里

我们在介绍ExoPlayer之前

让我们先来看看Android的媒体API

在Jelly Bean之前 Android的高层媒体播放器API

实际上是应用程序的开发人员用来开发视频

它使用起来真的非常简单

这个例子就是只需要两行代码就可以播放一段视频

第一行创建播放器 第二行就开始播放

开发者用这两行代码几乎全部隐藏了

所有的复杂的视频回放

然而 在隐藏之下 为了能让视频重复播放

实现媒体播放器是做了大量的工作的

对于流式传输 播放器需要做的第一件事

就是通过网络去下载视频数据

这个数据需要根据一些策略来缓冲

当更多的数据需要被下载时该策略将指定缓冲的时机

以及缓冲多少内容

在视频能够播放之前

单独的音频和视频样本

需要以他们被发送的格式

从容器中提取出来

然后这些样本需要被解码

最后 译码器解码出的视频样品就

会被传达到荧幕和观众

在稍微高一点的层次上 播放器

需要跟踪其整体状况 比如重放位置

重放是否正确的进行

媒体播放器API的操作是很便捷的

因为它隐藏了所有的复杂的事物

然而,这个方法的一个缺点是

更多优秀的开发者

不能修改或者扩展其潜在的行为

以更好的适应他们的需求

举个例子 开发人员无法调整缓冲策略

或添加一个持久高速缓存用于缓存媒体数据

为了更好的支持这些使用场景

我们给Android添加了底层的多媒体接口

从Android4.3起 内置的媒体接口

就提供了联网 缓冲和媒体提取功能

我们还增加了MediaCodec API

它提供了访问解码器 包括

硬件加速的视频解码器

该MediaCodec API支持视频帧的直接渲染

和可以使用音频轨道进行播放音频的解码接口

这是从Android1.5就开始的困扰

这些底层的API为开发人员提供了一种可以的替代

Android的高层媒体播放器的方案

这些API使人们有可能用JAVA建立应用级媒体播放器

同时他们的播放器的

逻辑是从应用级层面来实现的

此代码通常将调用提供的API

来装入和提取多媒体样品

对他们进行解码 并呈现出来

开发者可以选择性地

在应用层面实现这些功能

例如 联网 缓存

同时样本提取使开发人员可以

更轻松地自定义这些组件

在谷歌 我们已经开发了自己的应用程序级媒体

播放器 叫做ExoPlayer

它同时支持DASH和自适应式平滑流传输

回放 DRM保护的内容 并已专门为

易于进行修改和扩展而设计

谷歌的YouTube和播放电影的应用

已经在一些较新的Android设备上使用了

而我们也看到了一些了不起的结果

例如 播放电影 用ExoPlayer进行DASH回放时

已经可以看出 减少了65%的回放延迟

减少至少40%的缓存以及平均提高11%的

播放分辨率 这些都是相对使用媒体播放器而言的

由于ExoPlayer是应用层的多媒体

播放器 我们能够调整它 并添加新功能

通过Play 商店进行更新

我们希望,这将使我们能够进一步提高

这些性能数据

我们真的对Exoplayer 给我们自己的

应用程序带来的进步感到很高兴

但是,我们认识到,对于多数的开发者

采取相似的做法的壁垒是相当高的

ExoPlayer本身就是大约16000行代码

并且使用了Android的底层的多媒体API是一个挑战

所以从头开始创建这样的播放器需要做出很多的努力

出于这个原因 我们决定开源ExoPlayer

我们希望以此来降低进入门槛

允许第三方开发者获得类似的改进

无需承担从头开发

他们自己的应用程序级媒体播放器的成本

让我们来看看ExoPlayer是如何设计的

以及你如何在自己的应用程序中使用它

而不是使用一个单一的Java对象

一个ExoPlayer是从一系列模块化部件构成的

其中的每一个部件都对所期望的行为

或播放器的一种功能做出贡献

在顶层 我们有ExoPlayer

对象本身 这在保持播放器的状态方面

几乎不占用资源

这个对象调用到组件叫做跟踪渲染

它的工作是在播放过程中呈现媒体

ExoPlayer库提供一个轨道渲染器来

播放视频 它采用了MediaCodec API

来解码所述视频的样本 并使其呈现在表面

它支持它们在底层的解码器中的

任何视频格式

H.264是常用的

该ExoPlayer库还提供轨道渲染器来播放音频

该渲染器其使用MediaCodec API来

解码音频样本和音频轨道API来播放它们

而音频和视频轨道渲染的实现都

需要得到由一个样品源组件

提供的采样

对于那些不需要控制

网络,缓冲和样本提取行为的开发者来说

ExoPlayer库提供了

名为FrameworkSampleSource的实现方法

其中链接到Android的媒体来提取API

通过这样做,它提供了在Android 中

运行的所有容器格式的支持

让我们来看看相应的代码

首先 我们所建立的样本源

通过该URI到其中视频载入的位置

然后 我们让我们的音频和视频渲染器渲染样品源

最后 我们建立ExoPlayer的一个实例

经过两个渲染器 并开始播放

这是最简单的ExoPlayer如何可以使用的例子

现在让我们来看看 一个更复杂的使用情况下

ExoPlayer具体如何支持

DASH和SmoothStreaming自适应回放

对于DASH和SmoothStreaming ExoPlayer库所

包含的组件完全

取代了Android的媒体提取API

有一个叫做ChunkSampleSource组件的单个实例

被用于向提供音频和视频渲染器提供样本

每个ChunkSampleSource需要来自的媒体块

一组源组件

通常介于2秒和10秒的持续时间

在这个例子中 我们将重点放在DASH

DASH MP4 ChunkSource组件应该被用到之处的的反馈上

最后 每个ChunkSource需要一个数据源

正如其名称所暗示的 数据源组件

负责实际加载多媒体

在这种情况下 我们使用了

在网络上的转移数据的HTTP数据源

请注意 对于DASH回放音频和视频通常

分开是分开传输的 这就是为什么有两个HTTP

数据源组件 而不是只有一个

回头看看代码

你可以看到每个组件是如何用

它所依赖的组件来实现注入的

该视频渲染器被注入了采样源

它与ChunkSource一同被注入

也与数据源一起被注入

这种从很多使用依赖注入的组件构建的

做法让播放器能够

很容易地让应用程序开发者

替换其中的任何组件或全部

以自己的自定义的样子就行

我已经到目前为止已经展示了一个稍微简化对象模型

在一个完整的例子中 一些更多的组件是必需的

首先,一些被叫做加载控制的东西

被要求用于管理媒体块的缓冲

其次 也是最重要的是用于自适应回放

每个ChunkSource需要一种叫做格式评估

格式评估从可用格式中进行选择

在媒体每块请求之前

对于音频我们使用一个固定的实现方式

将针对一个单一的格式

对于视频 我们使用一个自适应的实现方式

这将对于当前网络状况

选择一个合适的格式

其旨在为用户提供可能的最高质量

而不会导致任何缓冲

现在我们知道如何建立一个ExoPlayer

使用由ExoPlayer库提供的标准组件

来实现自适应回放

我也谈到了一个应用程序开发人员

定制这样的播放器 以更好地满足他们的特定用例是多么容易

现在让我们来看看一些例子

假设开发人员希望添加持久缓存的

缓存媒体数据 而如果用户观看

同一个视频两次

它的第二次就将从缓存播放

在ExoPloayer模型中 它很简单

当构建播放器时 开发者可以简单地插入

缓存中的数据源组件

缓存DataSource组件是由ExoPlayer库提供的

但同样 开发人员可以自由地编写它

自己从无到有地实现它

同样地 一个开发者可以选择

替换默认LoadControl实现方式

以实现不同的缓冲行为

或者实现一个完全自定义的轨迹渲染器

例如 为了在视频之上覆盖另一层

自适应回放最普遍使用的能力是

注入的自定义格式评估器

这使得开发者能够用

自己的自适应算法来体验它

ExoPlayer还有许多其他的

可以被扩展和定制方法

我们期待着看到

开发人员可以用它做什么

综上所述 我们已经看到了Android的底层的多媒体

接口是如何让强大的应用级的开发多媒体播放器工作的

它可以更容易地更新

修改 并由开发者们扩展

相比android的标准多媒体播放器

谷歌正在使用ExoPlayer来实现

对于我们自己的应用程序的益处

我们希望通过开源ExoPlayer来实现这一点

我们将允许其他开发者实现类似的结果

所以 如果你很好奇 想了解更多信息

那么就访问开发者指南吧

你会发现大量的有用信息

还有一些了不起的例子来帮助你开始

Youtube
Youtube
加入 GDG 字幕组
video_screenshot