欧美,精品,综合,亚洲,好吊妞视频免新费观看,免费观看三级吃奶,一级a片女人自慰免费看

您當(dāng)前的位置是:  首頁 > 資訊 > 國內(nèi) >
 首頁 > 資訊 > 國內(nèi) >

Pinterest:Android系統(tǒng)上的視頻管理

2019-09-29 09:27:54   作者:文 / Grey Skold   譯 / 屈健寧   來源:CTI論壇   評論:0  點擊:


  Pinterest通過在Android應(yīng)用中添加適當(dāng)?shù)囊曨l管理,在為用戶提供更加流暢的視頻體驗的同時,盡可能的為開發(fā)人員提供易于使用的視頻組件,簡化其工作流程。本文來自Pinterest工程博客。
  原文
  https://medium.com/pinterest-engineering/managing-videos-on-android-f59da9601d5f
  2016年P(guān)interest安卓應(yīng)用上發(fā)布的視頻模塊,其目標是使得應(yīng)用能夠提供無縫的視頻體驗。包括支持在每個屏幕上同時播放多個視頻,并且通過滾動出屏幕自動暫停播放的方式來動態(tài)地控制視頻的播放狀態(tài)以及同時播放的視頻數(shù)量。
  很快我們發(fā)現(xiàn)其實需要應(yīng)對的技術(shù)挑戰(zhàn)有很多,例如:
  • 管理當(dāng)前所有可用視頻的播放狀態(tài)
  • 了解視頻在屏幕上的可見率
  • 為我們的開發(fā)人員提供易于使用的視頻組件
  • 隨著工作的進行,我們逐漸調(diào)整視頻架構(gòu)來滿足這些需求,下面我們將在最新的視頻模塊中深入探討如何應(yīng)對這些挑戰(zhàn)。
  視頻管理
  從更高的層次上來看,我們需要構(gòu)建一個組件,這個組件需要感知屏幕上所有可用的視頻實例(即視圖)以及其相關(guān)的surfaces(即視頻片段)。管理surfaces對于監(jiān)控應(yīng)用于surfaces的子對象的生命周期狀態(tài)(即onStart()等)至關(guān)重要,并且避免在使用者層上添加過多代碼來將最新狀態(tài)更改應(yīng)用到視圖。
  為了跟蹤這些關(guān)鍵的生命周期事件,Android框架向我們提供了屏幕顯示內(nèi)容的當(dāng)前狀態(tài)以及視覺上影響我們應(yīng)用程序的任何更改。我們監(jiān)測的關(guān)鍵生命周期事件是UI附件調(diào)用(例如onAttachedToWindow())以及主機屏幕何時更改其顯示狀態(tài)(例如onPause()等)。
  使用這些回調(diào)方法,我們嘗試記錄已提供有效視頻URL的所有視頻。這將為我們提供當(dāng)前范圍內(nèi)可用的視頻的初始列表。
  在視頻框架的第一個迭代中,我們依靠客戶端代碼本身調(diào)用這些調(diào)用,但是我們發(fā)現(xiàn)這是不可擴展的。因為它在構(gòu)建視頻功能時增加了更多的復(fù)雜性。取而代之的方法是,我們通過構(gòu)建需要傳入基礎(chǔ)視頻組件的方法,提取了在VideoManager之后注冊視頻的回調(diào)方法。從那里,VideoManager將在幕后進行適當(dāng)?shù)挠嬎。由于它現(xiàn)在才可以“開箱即用”地工作,因此消除了觀眾對視頻記錄過程已經(jīng)具有預(yù)定義知識的需求。
  改進前
  // FooBarFragment.class for FooBar feature
  override fun onResume() {
  super.onResume()
  // Required by consumers to implement
  videoView?.apply {
  viewability = Viewability.FullyVisible
  onActivate()
  onViewCompletelyVisible()
  }
  }
  override fun onPause() {
  // Required by consumers to implement
  videoView?.apply {
  viewability = Viewability.NotVisible
  onDeactivate()
  }
  super.onPause()
  }
  改進后
  // BaseFragment.class implemented by all screens
  override fun onResume() {
  super.onResume()
  videoManager.onResume(this)
  }
  override fun onPause() {
  videoManager.onPause(this)
  super.onPause()
  }
  // VideoManager.class internally
  override fun onResume(videoSurface: VideoViewSurface) {
  videoSurface.videoViews.forEach {
  registerVideo(it)
  }
  }
  override fun onPause(videoSurface: VideoViewSurface) {
  videoSurface.videoViews.forEach {
  unregisterVideo(it)
  }
  }
  保留這個視頻列表讓我們可以根據(jù)應(yīng)用程序的當(dāng)前可見性來動態(tài)地設(shè)置播放狀態(tài)。同時這個方法還提供了基于在視頻記錄時傳遞的某些元數(shù)據(jù)屬性動態(tài)更改之類其他功能的靈活性。
  例如,我們可能希望所有視頻廣告都自動播放,但僅限于在同一片段上自動播放1個有機視頻(即創(chuàng)作者生成的內(nèi)容)。通過檢查在單個視頻上記錄的元數(shù)據(jù),我們可以將這些限制應(yīng)用于UI層。
  我們還提取了所有Pinterest特定的分析代碼,用以來聚焦在視頻管理器(管理和播放視頻)功能上,同時讓這個管理組件和應(yīng)用程序之間保持獨立。
  計算可視性
  可視性定義為在屏幕上顯示的UI組件的可見區(qū)域的百分比。此度量對于我們了解當(dāng)前顯示給用戶的內(nèi)容至關(guān)重要。有了這些信息,我們就能為合作伙伴收集有關(guān)其內(nèi)容參與度的信息。
  在常見情況下,由于VideoManager保留對所有活動視頻的引用,因此我們可以跟蹤視圖的確切坐標(即getLocationInWindow())和設(shè)備的屏幕尺寸(以像素為單位)(請參見DisplayMetrics),以推斷其在屏幕上的可見性。
  我們還通過以下方式處理重疊的UI組件:
  向消費者提供包括一系列``障礙物’'視圖的選項,這些視圖可能會覆蓋我們的基礎(chǔ)視頻(例如工具欄,浮動按鈕等)
  顯示彈出窗口的回調(diào)(即onWindowFocusChanged())屏幕滾動組件或UI組件不在屏幕上(請參閱RecyclerView監(jiān)聽器)
  屏幕上顯示視頻表面時的其他回調(diào)(即onResume()等)
  為開發(fā)人員打造的內(nèi)容
  雖然我們希望減少開發(fā)人員面臨的視頻管理復(fù)雜性,但是這其中最大的困難就是采用新的視頻界面。因此,我們都抽象出了視頻設(shè)置的復(fù)雜性以及Google PlayerView提供的UI組件的使用:
  改進前
  // FooBar video feature, requires custom FooBarVideoView.class of 100+ lines
  object : FooBarVideoView(
  context,     // application context
  analytics,   // Analytics object
  url,         // video url
  uid,         // unique ID
  false        // isAd flag
  ) {
  // configuration flag for custom setup (mute, autoplay, controller, etc.)
  override val videoConfiguration = VideoConfiguration.FOO_BAR
  }.apply {
  shouldLoop = true
  videoAspectRatio = aspectRatio
  render(videoMetaData) // loads video, videoMetaData contains: url, isAd, uid
  }
  改進后
  // Foobar video feature, no custom class required just set flags
  PinterestVideoView(context).apply {
  // Optional params for setup/customization
  this.analytics = pinterestAnalytics
  this.mute = false
  this.autoPlay = true
  this.alwaysAutoplay = true
  this.alwaysPlay = true
  this.showMute = true
  this.looping = true
  this.bufferingRule = SHOW_BUFFERING_ALWAYS
  }.apply {
  render(videoMetaData) // loads video, videoMetaData contains: url, isAd, uid
  }
  視頻基礎(chǔ)架構(gòu)的另一個復(fù)雜性是實際的VideoManager體系結(jié)構(gòu)本身。在我們的重寫中,我們將大多數(shù)舊組件合并為僅支持正常運行的VideoManager的核心部分。
  改進前
  改進后
  我們新的VideoManager體系結(jié)構(gòu)為事件和組件之間的相互關(guān)系提供了清晰的層次結(jié)構(gòu)。這不僅在紙面上看起來不錯,而且僅重構(gòu)一項就刪除了約4,500行代碼(不到原始實現(xiàn)大小的1/3)
  展望
  建立適當(dāng)?shù)?ldquo;視頻管理”是一個漫長而艱巨的過程,但是多年來,我們已經(jīng)構(gòu)建了一些真正經(jīng)過改進的東西,以幫助簡化我們的開發(fā)流程和Pinner體驗。將來,我們希望開源我們的工作,以便其他開發(fā)人員可以為正在進行的處理動態(tài)視頻回放做出貢獻。我們將繼續(xù)迭代我們的視頻客戶端架構(gòu),以應(yīng)對新的挑戰(zhàn),以期為Pinners和開發(fā)人員提供令人愉悅的視頻體驗。來源:LiveVideoStack
【免責(zé)聲明】本文僅代表作者本人觀點,與CTI論壇無關(guān)。CTI論壇對文中陳述、觀點判斷保持中立,不對所包含內(nèi)容的準確性、可靠性或完整性提供任何明示或暗示的保證。請讀者僅作參考,并請自行承擔(dān)全部責(zé)任。

相關(guān)閱讀:

專題

CTI論壇會員企業(yè)