1. 程式人生 > >android視訊播放框架Vitamio

android視訊播放框架Vitamio

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

        概述

        開發公司一個樂視TV專案時,本來有個播放視訊廣告的功能,到最後不了了之。雖然沒有在專案中做要求,但是這個點子還是激起了我研究多媒體的好奇心。剛好後面遇到一款比較喜歡的視訊APP魔力盒,上面視訊播放的體驗及整個產品的設計都是我喜歡的型別,於是反編譯了一下,發現其中用到了一個視訊框架Vitamio,(還有一個很流暢的下拉重新整理框架hardmark), 然後,一番百度google,發現居然是國內團隊開發的框架,而且應用已經很廣泛。所以研究了下,自己寫了個demo。


       資料總結

       Vitamio官網:https://www.vitamio.org

       原始碼地址:https://github.com/yixia/VitamioBundle

          最佳教程:大名鼎鼎的農民伯伯部落格http://www.cnblogs.com/over140/category/409230.html,農民伯伯應該是這個開發團隊的一員。

          VPlayer好像是這個框架的最佳產品,不過看到官網的一些合作伙伴,如果確實是用到這個框架的話,好像也很不錯(可以反編譯看看,學習學習~)

          下面是農名伯伯開發教程實現的產品的原始碼(下載測試後,可以執行,掃描本地視訊好像沒找到檔案,仔細找下原因應該是可以解決的,專案用到的內容還算是比較常規的吧,沒有比較難懂的地方,也可能是我沒有研究那麼細):

      專案地址:http://code.taobao.org/p/oplayer
      SVN地址:http://code.taobao.org/svn/oplayer/ 

           總體感覺,初次接觸會比較難理解,花點時間去研究的話,還是比較好懂的,這個框架發展了這麼久,現在算是比較成熟了。目前還是面向個人開發者免費。如果有需要的話,可以引用。

        

          資料引用

          

【Android】OPlayer升級Vitamio到4.1 摘要: 很久沒有更新OPlayer,還是使用舊版Vitamio 3.0版本(新版已經到4.1),這次更新下。 閱讀全文 posted @  2013-09-20 11:00 農民伯伯 閱讀(5970) |  評論 (26)  編輯 【Android】Vitamio 4.0 正式版釋出/ Vitamio IOS 測試版釋出(2013-07-16) 摘要: Vitamio 4.0 正式版釋出! 閱讀全文 posted @  2013-07-16 16:05 農民伯伯 閱讀(5520) |  評論 (18)  編輯 【Android】Vitamio 4.0 公測版釋出(2013-05-28) 摘要: 【Android】Vitamio 4.0 公測版釋出(2013-05-28) 閱讀全文 posted @  2013-05-28 15:09 農民伯伯 閱讀(4662) |  評論 (13)  編輯 Vitamio不支援特性列表(本文會持續更新 2013-03-13) 摘要: 一直再說Vitamio的優點,這裡也羅列一下缺點,一方面提醒開發者注意,另一方面也更好的提供給Vitamio團隊參考之用,作為後續版本升級的參考。 閱讀全文 posted @  2013-03-13 10:18 農民伯伯 閱讀(3700) |  評論 (25)  編輯 使用Vitamio打造自己的Android萬能播放器(12)—— 播放網路視訊緩衝處理 摘要: 受限於網速等原因,播放網路視訊時一般都會要加上緩衝處理,一般可以通過設定加大緩衝和顯示正在緩衝的進度條來改善體驗。 閱讀全文 posted @  2013-03-12 13:20 農民伯伯 閱讀(10028) |  評論 (11)  編輯 Vitamio 3.0 新手教程 摘要: Vitamio專案發展迅猛,官方群突破400位開發者,基於Vitamio的專案突破1000個,使用Vitamio提供優質播放體驗的使用者超過5000萬。文件是短板,也歡迎大家分享你的Vitamio使用經驗,本文將進一步介紹Vitamio的簡單使用方法。 閱讀全文 posted @  2013-01-15 10:58 農民伯伯 閱讀(22644) |  評論 (14)  編輯 使用Vitamio打造自己的Android萬能播放器(11)—— 本地掃描後臺服務 摘要: Vitamio和OPlayer系列文章得到廣大同行的關注和支援,非常感謝!離系列文章的上篇有幾個月了,各種忙暫停了本系列文章,非常抱歉!離OPlayer正式上線還有距離,還有很多要做的事情,繼續前行! 閱讀全文 posted @  2012-11-07 17:49 農民伯伯 閱讀(5985) |  評論 (15)  編輯 Vitamio中文API文件(5)—— MediaPlayer 摘要: MediaPlayer是Vitamio的核心類,與系統自帶的這個類用法類似,是基於Vitamio開發自己Android播放器必讀文件。 閱讀全文 posted @  2012-09-06 14:39 農民伯伯 閱讀(12863) |  評論 (10)  編輯 Vitamio中文API文件(4)—— VitamioInstaller 摘要: 在使用程式任何類和方法以前,建議使用這個類來檢查裝置是否已經安裝Vitamio外掛。 閱讀全文 posted @  2012-09-03 17:48 農民伯伯 閱讀(3893) |  評論 (2)  編輯 Vitamio SDK 2.0 新版釋出(2012-08-31) 摘要: 離上次發版有將近兩個月時間,總算是把解決共存問題新版發出來,期間VPlayer新版本也發了6個。還請大家理解,VPlayer是團隊的主業,Vitamio是副業,所以無法保證能按時發版,不過以後會逐步提升Vitamio的重要性,感謝支援,歡迎使用! 閱讀全文 posted @  2012-08-31 15:54 農民伯伯 閱讀(8627) |  評論 (19)  編輯 Vitamio中文API文件(3)—— MediaController 摘要: MediaController與VideoView配套使用,基本能實現播放介面的主要功能,大家可用參考 OPlayer的程式碼實現。 閱讀全文 posted @  2012-08-30 14:34 農民伯伯 閱讀(6134) |  評論 (1)  編輯 Vitamio中文API文件(2)—— VideoView 摘要: VideoView是Vitamio最重要的類之一,使用方法與系統的VideoView差不多,提供諸多方法供開發者呼叫,實現各種強大的播放功能,例如外掛字幕,畫面縮放、設定畫面質量等。 閱讀全文 posted @  2012-08-30 10:42 農民伯伯 閱讀(13466) |  評論 (11)  編輯 Vitamio中文API文件(1)—— MediaStore 摘要: Vitamio新版SDK釋出在即,文件一直欠缺,接下來的一段時間將陸續補上,後續還會推出開發者指南等系列文章,官網也在改版,幫助開發者更好的使用Vitamio。本章MediaStore主要用於讀取本地視訊、音訊資訊、縮圖用,請參加Vitamio萬能播放器系列文章第10篇。 閱讀全文 posted @  2012-08-29 11:32 農民伯伯 閱讀(7590) |  評論 (1)  編輯 Vitamio FAQ(2012-11-20 ) 摘要: Vitamio系列文章彙總FAQ,詳細回答關於Vitamio各種問題 閱讀全文 posted @  2012-08-01 10:02 農民伯伯 閱讀(13097) |  評論 (52)  編輯 [重要]使用Vitamio打造自己的Android萬能播放器(10)—— 本地播放 (縮圖、視訊資訊、視訊掃描服務) 摘要: Vitamio是團隊的誠意之作,我們除了要將VPlayer打造成Android最好的播放器,也要將Vitamio播放元件打造成Android最好的播放器元件。新版釋出內測SDK雖然還有一些問題,但已經具備高可擴充套件性、便捷性和許多內建實用的功能,後續文章將繼續深挖和介紹Vitamio的使用細節和方法。本章將提供顯示縮圖、視訊大小等視訊資訊,並介紹使用Vitamio內建的ContentProvider以及檔案掃描服務。 閱讀全文 posted @  2012-07-21 15:27 農民伯伯 閱讀(11273) |  評論 (36)  編輯 使用Vitamio打造自己的Android萬能播放器(9)—— 線上播放 (線上電視) 摘要: 如果不想自己去找視訊看,以傳統方式看電視也不錯,比如CCTV、湖南衛視等。本章從網路收集幾百個電視臺的地址,採用多級分類方式呈現,極大豐富線上播放部分的內容。 閱讀全文 posted @  2012-07-15 12:22 農民伯伯 閱讀(7979) |  評論 (11)  編輯 使用Vitamio打造自己的Android萬能播放器——新版Vitamio內測SDK釋出 摘要: Vitamio系列文章至今受到了許多Android開發者和創業者的關注,新版的SDK也在千呼萬喚中釋出,雖然處於內測階段,已明顯改善並達到預期,極其方便和友好的整合到自己的產品中,歡迎大家搶先測試! 閱讀全文 posted @  2012-07-09 12:23 農民伯伯 閱讀(15011) |  評論 (71)  編輯 使用Vitamio打造自己的Android萬能播放器(8)——細節優化 摘要: 成功的產品往往在細節之處也做到極致,產品和專案從使用的角度來看最大的區別我認為也就是細節的處理上。開播視訊的目標是產品,前面7篇文章高歌猛進,添加了很多的功能,也該停下來休整一下,優化一下,也歡迎交流反饋做得不周到的地方。由於開源,大家也可以按照自己的喜好來新增修改不同的功能和細節。 閱讀全文 posted @  2012-07-08 18:48 農民伯伯 閱讀(6139) |  評論 (0)  編輯 使用Vitamio打造自己的Android萬能播放器(7)——線上播放(下載視訊) 摘要: 本章將實現非常實用的功能——下載線上視訊。涉及到多執行緒、執行緒更新UI等技術,還需思考產品的設計,如何將新加的功能更好的融入到現有的產品中,並不是簡單的加一個介面就行了,歡迎大家交流產品設計和技術細節實現! 閱讀全文 posted @  2012-06-29 14:45 農民伯伯 閱讀(10083) |  評論 (26)  編輯 使用Vitamio打造自己的Android萬能播放器(6)——線上播放(播放列表) 摘要: 新版本的VPlayer由設計轉入開發階段,預計開發週期為一個月,這也意味著新版本的Vitamio將隨之釋出,開發者們可以和本系列文章一樣,先開發其他功能。本章內容為"線上視訊播放列表",集合了主流各大視訊網站的手機版,歡迎給"開播視訊"反饋改進建議! 閱讀全文 posted @  2012-06-20 10:27 農民伯伯 閱讀(10577) |  評論 (10)  編輯 使用Vitamio打造自己的Android萬能播放器(5)——線上播放(播放優酷視訊) 摘要: 為了保證每週一篇的進度,又由於Vitamio新版本沒有釋出, 決定推遲本地播放的一些功能(截圖、視訊時間、尺寸等),跳過直接寫線上播放部分的章節。從Vitamio的介紹可以看得出,其支援http、m3u8等多種網路協議,本章將編寫播放優酷視訊的例子。 閱讀全文 posted @  2012-06-15 14:47 農民伯伯 閱讀(17903) |  評論 (20)  編輯 使用Vitamio打造自己的Android萬能播放器(4)——本地播放(快捷搜尋、資料儲存) 摘要: 本章節把Android萬能播放器本地播放的主要功能(快取播放列表和A-Z快速查詢功能)完成,和播放元件關係不大,但用到一些實用的技術,歡迎交流! 閱讀全文 posted @  2012-06-08 17:59 農民伯伯 閱讀(8284) |  評論 (14)  編輯 使用Vitamio打造自己的Android萬能播放器(3)——本地播放(主介面、播放列表) 摘要: 打造一款可用的Android播放器有許多功能和細節需要完成,也涉及到各種豐富的知識和內容,本章將結合Fragment、ViewPager來搭建播放器的主介面,並實現本地播放基本功能。系列文章提供截圖、程式碼說明、原始碼下載,歡迎交流! 閱讀全文 posted @  2012-05-30 17:27 農民伯伯 閱讀(12798) |  評論 (22)  編輯 使用Vitamio打造自己的Android萬能播放器(2)—— 手勢控制亮度、音量、縮放 摘要: 本章繼續完善播放相關播放器的核心功能,為後續擴充套件打好基礎。 閱讀全文 posted @  2012-05-22 16:19 農民伯伯 閱讀(22546) |  評論 (18)  編輯 使用Vitamio打造自己的Android萬能播放器(1)——準備 摘要: 雖然Android已經內建了VideoView元件和MediaPlayer類來支援開發視訊播放器,但支援格式、效能等各方面都十分有限,這裡與大家一起利用開源專案Vitamio來打造屬於自己的Android萬能播放器! 閱讀全文 posted @  2012-04-26 14:43 農民伯伯 閱讀(65020) |  評論 (41)  編輯

     

         iteye上面有幾篇

http://www.iteye.com/topic/1124550

 

          相關知識點

          專案中有個獲取視訊縮圖的功能,在VPlayer的原始碼中好像註釋掉了,從API 8開始,現有Android API裡面就有了一個用於實現相關功能的類

      android.media.ThumbnailUtils這個類提供了3個靜態方法一個用來獲取視訊第一幀得到的Bitmap,2個對圖片進行縮略處理。

publicstatic Bitmap createVideoThumbnail (String filePath, int kind)

第一個引數是視訊檔案的路徑,第二個引數是指定圖片的大小,有兩種選擇Thumbnails.MINI_KINDThumbnails.MICRO_KIND。

  • 第一種文件上說大小是512 x 384 ,我用一個MP4格式檔案測試得到544 x 960,用一個wmv格式檔案測試得到160 x 120。明顯不靠譜。
  • 第二種引數兩種格式檔案得到的大小都是 96 x 96,這個才是縮圖。
extractThumbnail(Bitmap source, int width, int height, int options)extractThumbnail(Bitmap source, int width, int height)

這兩種方法都是用來處理Bitmap的大小的,第一個引數是要處理的Bitmap,第二個引數是處理後寬度,第三個是高度,第四個引數options,如果options定義為OPTIONS_RECYCLE_INPUT,則回收資源。也就是說可以用第三種方法把擷取到的視訊第一幀的Bitmap轉成任意想要的大小,第三個方法還可以獲取記憶體卡內圖片的縮圖。

Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(path1, Thumbnails.MINI_KIND);  bitmap = ThumbnailUtils.extractThumbnail(bitmap, 210, 210);

API 10開始新增一類MediaMetadataRetriever可以用來獲取媒體檔案的資訊

MediaMetadataRetriever mmr = new MediaMetadataRetriever();  mmr.setDataSource("/sdcard/33.mp4");  Bitmap bitmap = mmr.getFrameAtTime();  image.setImageBitmap(bitmap);  System.out.println(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE)+"");  System.out.println(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE)+"");  mmr.release();

MediaMetadataRetriever可以獲取視訊任何一幀的縮圖。

 

publicstatic Bitmap createVideoThumbnail(String filePath) {      // MediaMetadataRetriever is available on API Level 8      // but is hidden until API Level 10      Class<?> clazz = null;      Object instance = null;      try {          clazz = Class.forName("android.media.MediaMetadataRetriever");          instance = clazz.newInstance();            Method method = clazz.getMethod("setDataSource", String.class);          method.invoke(instance, filePath);            // The method name changes between API Level 9 and 10.  if (Build.VERSION.SDK_INT <= 9) {              return (Bitmap) clazz.getMethod("captureFrame").invoke(instance);          } else {              byte[] data = (byte[]) clazz.getMethod("getEmbeddedPicture").invoke(instance);              if (data != null) {                  Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);                  if (bitmap != null) return bitmap;              }              return (Bitmap) clazz.getMethod("getFrameAtTime").invoke(instance);          }      } catch (IllegalArgumentException ex) {          // Assume this is a corrupt video file      } catch (RuntimeException ex) {          // Assume this is a corrupt video file.      } catch (InstantiationException e) {          Log.e(TAG, "createVideoThumbnail", e);      } catch (InvocationTargetException e) {          Log.e(TAG, "createVideoThumbnail", e);      } catch (ClassNotFoundException e) {          Log.e(TAG, "createVideoThumbnail", e);      } catch (NoSuchMethodException e) {          Log.e(TAG, "createVideoThumbnail", e);      } catch (IllegalAccessException e) {          Log.e(TAG, "createVideoThumbnail", e);      } finally {          try {              if (instance != null) {                  clazz.getMethod("release").invoke(instance);              }          } catch (Exception ignored) {          }      }      returnnull;  }

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述