使用VideoView開發視頻總結

来源:http://www.cnblogs.com/1925yiyi/archive/2017/06/02/6932579.html
-Advertisement-
Play Games

一、VideoView及其相關組件總結 在Android中,播放視頻有2種方式,第一種方式是使用MediaPlayer結合SurfaceView來播放,通過MediaPlayer來控制視頻的播放、暫停、進度等,而通過SurfaceView來顯示視頻內容;第二種方式是使用VideoView來播放,這個 ...


一、VideoView及其相關組件總結

Android中,播放視頻有2種方式,第一種方式是使用MediaPlayer結合SurfaceView來播放,通過MediaPlayer來控制視頻的播放、暫停、進度等,而通過SurfaceView來顯示視頻內容;第二種方式是使用VideoView來播放,這個類其實也是繼承了SurfaceView類,並且實現了MediaController.MediaPlayerController這個用於控制媒體播放的介面,另外在VideoView上還有一個用於對媒體播放進行控制的面板,包括快進、快退、播放、暫停按鈕以及一個進度條。使用VideoView播放視頻的好處是簡單因為它已經幫我們實現了SurfaceView以及控制方法,開發過程中只需直接拿來使用就可以了,但它的缺點是不夠靈活。而是用MediaPlayer結合SurfaceView來播放視頻的話,好處是可以更靈活的對其進行自定義,缺點是難度較大。

1.1通過VideoView播放視頻步驟:

1、在界面佈局文件中定義VideoView組件,或在程式中創建VideoView組件

2、在Activity中獲取佈局文件中的組件並設置相應的監聽;

3、調用VideoView的如下兩個方法來載入指定的視頻:

   (1)setVideoPath(String path):載入path文件代表的視頻

   (2)setVideoURI(URI uri):載入uri所對應的視頻

在使用setVideoURI(URI uri)方法之前要設置網路視頻路徑

4、調用VideoViewstart()pause()resume()stopPlayback()方法控制視頻的播放(開始、暫停、繼續、停止)VideoViewgetDuration()可以返回視頻的長度,可以結合VideoViewresume()方法進行記憶播放和緩存播放。

1.2 VideoView常用方法

Android VideoView類為我們提供了十分方便的視頻播放API,其主要方法有:

 

方法名稱

說明

void start()

開始播放

void stopPlayback()

停止播放

void pause()

暫停

void resume()

重新播放

void seekTo(int msec)

從第幾毫秒開始播放

int getCurrentPosition()

獲取當前播放位置

int getDuration()

獲取當前視頻總長度

boolean isPlaying()

當前VideoView是否在播放視頻

void setVideoPath(String path)

以文件路徑的方式設置VideoView播放的視頻源

void setVideoURI(URI uri)

Uri的方式設置視頻源,可以是網路Uri或本地Uri

setMediaCotroller(MediaController controller)

設置MediaController控制器

 

setOnCompletionListener(MediaPlayer.onCompletionListener l)

監聽播放完成的事件

setOnErrorListener(MediaPlayer.OnErrorListener l)

監聽播放發生錯誤時候的事件

setOnPreparedListener(MediaPlayer.OnPreparedListener l)

監聽視頻裝載完成的事件

 

1.3 Media Controller

Media Controller類為我們提供了一個懸浮的操作欄,包含了播放,暫停,快進,快退,上一個,下一個等功能鍵。還有拖動進度條至某一處也可以實現。在使用前VideoViewMeidaController需要相互指定控制項。

 

Mdedia Controller類包含的內置方法有:

 

 

方法名稱

說明

boolean isShowing()

當前懸浮控制欄是否顯示。

void setMediaPlayer(MediaController.MediaPlayerControl player)

設置控制的組件

void hide()

隱藏MeidaController

void show()

顯示MeidaController

void show(int timeout)

設置MidiaController顯示的時間,以毫秒計算。如果設置為0則一直到調用hide()方法隱藏

void setPrevNextListeners(View.OnClickListener next,View.OnClickListener prev)

設置上一個視頻下一個視頻的切換事件

 

預設情況下,Media Controller懸浮顯示3s後隱藏,觸摸響應的VideoView呼出。預設上一個,下一個按鈕隱藏。

1.4 視頻格式

1.4.1 Android支持的視頻編碼格式

1.4.2 VideoView支持的影片格式

 

在實際測試中過程中,發現了一些由VideoView發出的Toast警告,內容寫著不支持影片格式,以致無法播放。VideoView僅能播放progressive streamable(漸進式流)的影片,一般的mp43gp若不採用progressive streamable模式轉文件的影片,是無法被VideoView通過網路播放的,但假如存放在local端(如儲存卡)則不在此限。

 

1.5 VideoView的監聽處理

開發過程中使用的VideoView監聽一共有3個:setOnCompletionListener(MediaPlayer.onCompletionListener l)setOnErrorListener(MediaPlayer.OnErrorListener l)setOnPreparedListener(MediaPlayer.OnPreparedListener l)

1.5.1 setOnCompletionListener(MediaPlayer.onCompletionListener l)

setOnCompletionListener(MediaPlayer.onCompletionListener l)用於監聽視頻播放完成後的事件

1.5.2 setOnErrorListener(MediaPlayer.OnErrorListener l)

 setOnErrorListener(MediaPlayer.OnErrorListener l)用於監聽VideoView在使用過程中出現的各種錯誤。

錯誤常數:

  • MEDIA_ERROR_IO 
  • 文件不存在或錯誤,或網路不可訪問錯誤 
  • : -1004 (0xfffffc14) 
  • MEDIA_ERROR_MALFORMED 
  • 流不符合有關標準或文件的編碼規範 
  • : -1007 (0xfffffc11) 
  • MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK 
  • 視頻流及其容器不適用於連續播放視頻的指標(例如:MOOV原子)不在文件的開始
  • : 200 (0x000000c8) 
  • MEDIA_ERROR_SERVER_DIED 
  • 媒體伺服器掛掉了。此時,程式必須釋放MediaPlayer 對象,並重新new 一個新的。 
  • : 100 (0x00000064) 
  • MEDIA_ERROR_TIMED_OUT 
  • 一些操作使用了過長的時間,也就是超時了,通常是超過了3-5 
  • : -110 (0xffffff92) 
  • MEDIA_ERROR_UNKNOWN 
  • 未知錯誤 
  • : 1 (0x00000001) 
  • MEDIA_ERROR_UNSUPPORTED 
  • 比特流符合相關編碼標準或文件的規格,但媒體框架不支持此功能 
  • : -1010 (0xfffffc0e) 
  • what int: 標記的錯誤類型
  • MEDIA_ERROR_UNKNOWN 
  • MEDIA_ERROR_SERVER_DIED 
  • extra int: 標記的錯誤類型
  • MEDIA_ERROR_IO 
  • MEDIA_ERROR_MALFORMED 
  • MEDIA_ERROR_UNSUPPORTED 
  • MEDIA_ERROR_TIMED_OUT 
  • MEDIA_ERROR_SYSTEM (-2147483648) - low-level system error.

1.5.3 setOnPreparedListener(MediaPlayer.OnPreparedListener l)

setOnPreparedListener(MediaPlayer.OnPreparedListener l)用於監聽視頻裝在完成後的事件

二、視頻旋轉

在網上查詢了眾多的關於屏幕旋轉的方法。總結起來可以分為4種。在介紹之前要先瞭解預設情況下Android屏幕旋轉機制(當然是在手機本身屏幕旋轉功能開啟的時候才能實現,自己在開發過程中一直發現開發視頻不能隨著手機一起旋轉,弄了幾個小時才發現是自己Android本身自帶的旋轉按鈕沒有開啟):

預設情況下,當用戶的重力感應器打開後,屏幕旋轉方向會導致當前activity發生onDestory->onCreate,這樣會重新構造當前activity和界面佈局,如果是在Camera界面,則表現為卡頓或者黑屏一段時間。如果是在橫豎屏UI設計方面,那麼想很好的支持屏幕旋轉,則建議在res中建立layout-landlayport兩個文件夾,把橫屏和豎屏的文件分別放入對應的layout文件夾中。

2.1 AndroidMainfest.xml設置

如果單單想設置橫屏或者豎屏,那麼只需添加橫豎屏代碼:

優點:即使屏幕旋轉,Actiity也不會重新onCreate

缺點:屏幕只有一個方向

2.2 代碼動態設置

如果需要動態改變橫豎屏設置,只要在代碼中調用setRequestedOrientation()函數:

優點:可以隨意動態設置,滿足人們為改變橫豎屏的要求,同時滿足橫豎屏UI不同的設計需求

缺點:如果改變設置,那麼Activity會被銷毀,重新構建,即重新onCreate;

2.3 重寫onCongigurationChanged

使用此方法可以避免旋轉屏幕時Activity被不斷的onCreate情況(這種情況下往往造成屏幕切換時的卡頓)。

首先,在AndroidMainfest.xml中添加configChanges

註意:keyboardHidden表示鍵盤輔助功能隱藏,如果你的開發API等級等於或高於13,還需要設置screenSize,因為screenSize會在屏幕旋轉時改變

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • github鏈接 借鑒吾記APP,使用 vue2.0+vue-router+vuex 為主要技術棧,elementui做為ui框架,多模塊 spa 模式,webpack2.0 負責模塊打包,gulp 負責處理靜態資源打包、壓縮,歡迎打賞star!!! 安利一下 吾記前端構建流程 本地環境準備 安裝n ...
  • 一、來源 在電腦科學中,柯里化(Currying)是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,並且返回接受餘下的參數且返回結果的新函數的技術。這個技術由 Christopher Strachey 以邏輯學家 Haskell Curry 命名的,儘管它是 Moses ...
  • 前端變化飛快,掌握一門前端框架在當下開發中必不可少,vue.js作為三大框架之一,擁有友好的中文文檔,平緩的學習曲線,在經過一段時間的學習之後,自己也用vue實現了一個簡單的小dome,項目雖小,但都用到了當下最常用的技術,可謂是麻雀雖小、五臟俱全。 ...
  • <header></header> 頁眉 主要用於頁面的頭部的信息介紹,也可用於板塊頭部 <hgroup></hgroup> 頁面上的一個標題組合 一個標題和一個子標題,或者標語的組合 <hgroup> <h1>妙味課堂</h1> <h2>帶您進入富有人情味的IT培訓</h2> </hgroup> ...
  • 代碼管理工具一開始用的確會有點懵,但是永久了就會發現都是那幾下套路,記錄下來 托管好了代碼一般起衝突了還是想重新搞一下,有個萬能的重置操作,那就是重新關聯svn項目,以前有時更換地址也是,發現遇到很多衝突問題,因為前面創建了文件,但是後來在伺服器上刪除了,結果衝突更換地址,發現衝突了,你又還原不了, ...
  • 什麼是EventBus 由greenrobot組織貢獻(該組織還貢獻了greenDAO),一個Android事件發佈/訂閱輕量級框架,功能:通過解耦發佈者和訂閱者簡化Android事件傳遞,EventBus可以代替Android傳統的Intent,Handler,Broadcast或介面函數,在Fr ...
  • 聲明 AS已經是Android開發的主流工具了,但是學校教學用的還是eclipse,很多同學不知道如何入門。網上看到一位大神整理得很好的教程,轉載過來,希望可以幫到有需要的人。 生命壹號:http://www.cnblogs.com/smyhvae/ 文章來源:http://www.cnblogs. ...
  • 0x00前言 一個安卓應用可以被調試的條件是應用AndroidManifest.xml顯示指定android:debuggable="true",如果沒有設置android:debuggable的值,則預設android:debuggable="false",所以發佈的應用大部分都是不可調試的,如果 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...