視頻框架Vitamio學習

   概述

        開發公司一個樂視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 公測版發佈(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上面有幾篇

 

          相關知識點

          項目中有個獲取視頻縮略圖的功能,在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;  
}

發佈了11 篇原創文章 · 獲贊 6 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章