Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 使用Vitamio打造自己的萬能播放器(10)—— 本地播放 (縮略圖、視頻信息、視頻掃描服務)

Android 使用Vitamio打造自己的萬能播放器(10)—— 本地播放 (縮略圖、視頻信息、視頻掃描服務)

編輯:關於Android編程

前言

 Vitamio是我們團隊的誠意之作,除了要將VPlayer打造成Android最好的播放器,也要將Vitamio打造成Android最好的播放器組件。新版發布內測SDK雖然還有一些問題,但已經具備高可擴展性、便捷性和許多內置實用的功能,後續文章將繼續深挖和介紹Vitamio的使用細節和方法。本章將提供顯示縮略圖、視頻大小等視頻信息,並介紹使用Vitamio內置的ContentProvider以及文件掃描服務。

注意

 本章ContentProvider在2012-8-31發布的SDK中已經不能使用,後續文章會更新用法。

  系列

1、Android 使用Vitamio打造自己的萬能播放器(1)——准備  

2、Android 使用Vitamio打造自己的萬能播放器(2)—— 手勢控制亮度、音量、縮放 

3、Android 使用Vitamio打造自己的萬能播放器(3)——本地播放(主界面、視頻列表) 

4、Android 使用Vitamio打造自己的萬能播放器(4)——本地播放(快捷搜索、數據存儲)

5、Android 使用Vitamio打造自己的萬能播放器(5)——在線播放(播放優酷視頻)

6、Android 使用Vitamio打造自己的萬能播放器(6)——在線播放(播放列表)

7、Android 使用Vitamio打造自己的萬能播放器(7)——在線播放(下載視頻)

8、Android 使用Vitamio打造自己的萬能播放器(8)——細節優化

9、Android 使用Vitamio打造自己的萬能播放器(9)——在線播放(在線電視)

正文

 一、目標

  1.1 獲取視頻縮略圖等

   之前的文章都是自己掃描獲取的視頻文件信息,這裡補充獲取視頻縮略圖、視頻寬帶的代碼,參加文章2.1部分。

  1.2 調用Vitamio的掃描服務

   新版SDK已經內置了視頻掃描服務,提供了本地視頻播放所需的全部數據。

 二、實現

  2.1 自己掃描獲取視頻的縮略圖、視頻寬高

 public static ArrayList<PFile> batchBuildThumbnail(final Context ctx, final ArrayList<File> files) {
 ArrayList<PFile> result = new ArrayList<PFile>();

 for (File f : files) {
 PFile pf = new PFile();
 try {
 if (f.exists() && f.canRead()) {
 //取出視頻的一幀圖像
 Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(ctx, f.getAbsolutePath(), Video.Thumbnails.MINI_KIND);
 if (bitmap == null) {
 //縮略圖創建失敗
 bitmap = Bitmap.createBitmap(ThumbnailUtils.TARGET_SIZE_MINI_THUMBNAIL_WIDTH, ThumbnailUtils.TARGET_SIZE_MINI_THUMBNAIL_HEIGHT, Bitmap.Config.RGB_565);
 Log.e(TAG, "batchBuildThumbnail createBitmap faild : " + f.getAbsolutePath());
 }

 pf.width = bitmap.getWidth();
 pf.height = bitmap.getHeight();

 //縮略圖
 bitmap = ThumbnailUtils.extractThumbnail(bitmap, ThumbnailUtils.dipToPX(ctx, ThumbnailUtils.TARGET_SIZE_MICRO_THUMBNAIL_WIDTH), ThumbnailUtils.dipToPX(ctx, ThumbnailUtils.TARGET_SIZE_MICRO_THUMBNAIL_HEIGHT), ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
 if (bitmap != null) {
 File thum = new File(f.getParent(), f.getName() + ".jpg");
 pf.thumb = thum.getAbsolutePath();
 //thum.createNewFile();
 FileOutputStream iStream = new FileOutputStream(thum);
 bitmap.compress(Bitmap.CompressFormat.JPEG, 85, iStream);
 iStream.close();
 }

 if (bitmap != null)
 bitmap.recycle();
 }
 } catch (Exception e) {
 Log.e(TAG, e);
 continue;
 } finally {
 result.add(pf);
 }
 }

 return result;

 } 

代碼說明:

    a). 縮略圖的尺寸是可以調整的,大家可以看一下這個默認大小。

    b). 這裡的代碼是縮略圖默認存在當前視頻路徑下面,並且文件名和視頻名稱一樣,多加了一個jpg的後綴。

  2.2 調用Vitamio的視頻掃描服務

   2.2.1  AndroidManifest.xml

 <receiver android:name="io.vov.vitamio.MediaScannerReceiver" >
 <intent-filter>
 <action android:name="android.intent.action.BOOT_COMPLETED" />
 </intent-filter>
 <intent-filter>
 <action android:name="android.intent.action.MEDIA_MOUNTED" />

 <data android:scheme="file" />
 </intent-filter>
 <intent-filter>
 <action android:name="com.yixia.vitamio.action.MEDIA_SCANNER_SCAN_FILE" />
 <action android:name="com.yixia.vitamio.action.MEDIA_SCANNER_SCAN_DIRECTORY" />

 <data android:scheme="file" />
 </intent-filter>
 </receiver>

 <service
 android:name="io.vov.vitamio.MediaScannerService"
 android:exported="false" >
 <intent-filter>
 <action android:name="io.vov.vitamio.IMediaScannerService" />
 </intent-filter>
 </service>
 
 <service
 android:name="io.vov.vitamio.VitamioService"
 android:exported="false" >
 <intent-filter>
 <action android:name="io.vov.vitamio.IVitamioService" />
 </intent-filter>
 </service>

代碼說明:

     主要是MediaScannerService服務和MediaScannerReceiver監聽器的注冊。

   2.2.2  啟動掃描服務(MainFragmentActivity)

 if (!io.vov.vitamio.LibsChecker.checkVitamioLibs(this, getClass().getName(), R.string.init_decoders, R.raw.libarm))
 return;

 OPreference pref = new OPreference(this);
 //首次運行,掃描SD卡
 if (pref.getBoolean(PREF_KEY_FIRST, true)) {
 getApplicationContext().startService(new Intent(getApplicationContext(), MediaScannerService.class).putExtra(MediaScannerService.EXTRA_DIRECTORY, Environment.getExternalStorageDirectory().getAbsolutePath()));
 pref.putBooleanAndCommit(PREF_KEY_FIRST, false);
 }

代碼說明:

     OPreference對象封裝了SharedPreferences 存儲數據。這裡判斷了是否首次啟動應用,是的話啟動視頻掃描服務。

   2.2.3  獲取數據(FragmentFile)

private static final String[] PROJECTION_MEDIA = new String[] { Video.Media._ID, Video.Media.TITLE, Video.Media.TITLE_KEY, Video.Media.SIZE, Video.Media.DURATION, Video.Media.DATA, Video.Media.WIDTH, Video.Media.HEIGHT };
 private static final String ORDER_MEDIA_TITLE = Video.Media.TITLE_KEY + " COLLATE NOCASE ASC";
 
 @Override
 public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
 Log.e(TAG, "onCreateLoader");
 return new CursorLoader(mParent, Video.Media.CONTENT_URI, PROJECTION_MEDIA, null, null, ORDER_MEDIA_TITLE);
 }

 @Override
 public void onLoadFinished(Loader<Cursor> arg0, Cursor newCursor) {
 Log.e(TAG, "onLoadFinished" + newCursor.getCount());
 mAdapter.swapCursor(newCursor);
 mListView.setSelectionFromTop(mVisiablePosition, mVisiableTop);
 }

 @Override
 public void onLoaderReset(Loader<Cursor> arg0) {
 Log.e(TAG, "onLoaderReset");
 mAdapter.swapCursor(null);
 }

代碼說明:

   a). FragmentFile繼承了LoaderCallbacks<Cursor>,相關的資料大家可以搜一下。

   b). 其中Video.Media.DATA 存的是視頻的路徑。

   c). 取縮略圖的方法:

     Video.Thumbnails.getThumbnail(ctx.getApplicationContext(), ctx.getContentResolver(), _id, Video.Thumbnails.MICRO_KIND, null)

    這個"_id"就是Video.Media._ID,縮略圖存在SD裡,大家可以自己加一些緩存處理。

 三、注意事項

   3.1 啟動視頻服務掃描前,需要先確保解碼庫已經被解壓,即調用代碼:LibsChecker.checkVitamioLibs

   3.2 確保MediaScannerService與當前應用程序在一個進程中,即不要指定其android:process,否則無法使用視頻掃描服務。

   3.3 目前獲取掃描完成廣播接收還有問題,即無法獲知是否已經掃描完成。目前的辦法是每次數據變更後5秒再去判斷是否有該Service,沒有了就表示已經掃描完成。參見方法MediaScannerReceiver.isServiceRunning。

  解碼庫

   https://bitbucket.org/ABitNo/ffmpegandroid

   http://vplayer.net      的首頁底部已經給出鏈接,注意代碼並不會實時同步,有需要的朋友可以參考一下。

 四、OPlayer

  4.1 下載

   請移步#Taocode(SVN):

   項目地址:http://code.taobao.org/p/oplayer

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

  4.2 更新

   a). 移動顯示SD剩余容量至底部,並在其左邊顯示正在加載的圖標。

   b). 保留原FragmentFile為FragmentFildOld,新版已經切換至使用Vitamio內置的視頻掃描服務。

   c). 更換Adapter為CursorAdapter,同時更新A-Z的功能,參加代碼更新。

   d). 新增了Preference,用於存儲一般設置數據,例如是否首次啟動。

 五、補充說明

  已經在SDK發布版本裡面強調了許多,這裡再強調一下:

  5.1 Vitamio相關項目不能同時存在同一個設備上,也不能與VPlayer共存,這是一個已知的BUG,下一版本會解決。

  5.2 Vitamio的示例工程需要在API Level14以上編譯,但是最低版本可以支持7以上(android:minSdkVersion="7")。可以把values-v11和values-v14兩個文件夾刪除,Vitamio在目前項目使用中是兼容Android2.1以上版本,更低的沒有試過,大家可以試一下。

  5.3 網絡視頻播放不了、很慢可能有以下幾個原因:

   a). 你的網速不行

   b). 視頻服務器不行,或者其帶寬不夠

   c). 可能是播放組件的問題,我們還在持續的改進,加大再網絡播放這部分的優化,感謝理解和支持。

    遇到這種情況的時候,如果方便請把視頻測試地址發給我們,並附上簡要說明。([email protected])

  5.4 一直停留在初始化解碼包界面的問題

   一般出現這種情況,只有一個原因:你的設備上還有其他Vitamio的相關項目,參照5.1。

結束

 這篇文章耗費了我至少10個小時以上,昨晚熬到2點,為的是解決使用者心中的疑慮,最終更好的服務於用戶。在文檔不夠全的情況下通過這種方式來與大家分享使用方法和技巧以及注意點,還請大家諒解。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved