• <strike id="fdgpu"><input id="fdgpu"></input></strike>
    <label id="fdgpu"></label>
    <s id="fdgpu"><code id="fdgpu"></code></s>

  • <label id="fdgpu"></label>
  • <span id="fdgpu"><u id="fdgpu"></u></span>

    <s id="fdgpu"><sub id="fdgpu"></sub></s>
    您當(dāng)前的位置是:  首頁(yè) > 資訊 > 國(guó)內(nèi) >
     首頁(yè) > 資訊 > 國(guó)內(nèi) >

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

    2019-09-29 09:27:54   作者:文 / Grey Skold   譯 / 屈健寧   來(lái)源:CTI論壇   評(píng)論:0  點(diǎn)擊:


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

    相關(guān)閱讀:

    專題

    CTI論壇會(huì)員企業(yè)

    亚洲精品网站在线观看不卡无广告,国产a不卡片精品免费观看,欧美亚洲一区二区三区在线,国产一区二区三区日韩 界首市| 瑞安市| 香河县| 阿图什市| 通海县| 金湖县| 巴中市| 营山县| 吴忠市| 大庆市| 永清县| 吴堡县| 资阳市| 嫩江县| 香格里拉县| 卫辉市| 宝清县| 长春市| 海兴县| 南宁市| 夏河县| 藁城市| 绍兴市| 青神县| 尉犁县| 永济市| 北流市| 苍溪县| 四子王旗| 灵武市| 车致| 海安县| 漳州市| 延寿县| 方正县| 霍州市| 英吉沙县| 陈巴尔虎旗| 兖州市| 周宁县| 邯郸市| http://444 http://444 http://444 http://444 http://444 http://444