天天看點

[重要]使用Vitamio打造自己的Android萬能播放器(10)—— 本地播放 (縮略圖、視訊資訊、視訊掃描服務)

前言

vitamio是我們團隊的誠意之作,除了要将vplayer打造成android最好的播放器,也要将vitamio打造成android最好的播放器元件。新版釋出内測sdk雖然還有一些問題,但已經具備高可擴充性、便捷性和許多内置實用的功能,後續文章将繼續深挖和介紹vitamio的使用細節和方法。本章将提供顯示縮略圖、視訊大小等視訊資訊,并介紹使用vitamio内置的contentprovider以及檔案掃描服務。

注意

本章contentprovider在2012-8-31釋出的sdk中已經不能使用,後續文章會更新用法。

聲明

  歡迎轉載,但請保留文章原始出處:) 

    部落格園:http://www.cnblogs.com

    農民伯伯: http://over140.cnblogs.com 

系列 

<a href="http://www.cnblogs.com/over140/archive/2012/06/15/2544658.html"></a>

正文 

一、目标

1.1 擷取視訊縮略圖等

之前的文章都是自己掃描擷取的視訊檔案資訊,這裡補充擷取視訊縮略圖、視訊寬帶的代碼,參加文章2.1部分。 

1.2 調用vitamio的掃描服務 

新版sdk已經内置了視訊掃描服務,提供了本地視訊播放所需的全部資料。 

[重要]使用Vitamio打造自己的Android萬能播放器(10)—— 本地播放 (縮略圖、視訊資訊、視訊掃描服務)

二、實作

2.1 自己掃描擷取視訊的縮略圖、視訊寬高

[重要]使用Vitamio打造自己的Android萬能播放器(10)—— 本地播放 (縮略圖、視訊資訊、視訊掃描服務)

    /** 批量提取視訊的縮略圖已經視訊的寬高 */

    public static arraylist&lt;pfile&gt; batchbuildthumbnail(final context ctx, final arraylist&lt;file&gt; files) {

        arraylist&lt;pfile&gt; result = new arraylist&lt;pfile&gt;();

        for (file f : files) {

            pfile pf = new pfile();

            try {

                if (f.exists() &amp;&amp; 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;

[重要]使用Vitamio打造自己的Android萬能播放器(10)—— 本地播放 (縮略圖、視訊資訊、視訊掃描服務)

    } 

代碼說明:

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

b). 這裡的代碼是縮略圖預設存在目前視訊路徑下面,并且檔案名和視訊名稱一樣,多加了一個jpg的字尾。

2.2 調用vitamio的視訊掃描服務

2.2.1 androidmanifest.xml 

[重要]使用Vitamio打造自己的Android萬能播放器(10)—— 本地播放 (縮略圖、視訊資訊、視訊掃描服務)

        &lt;receiver android:name="io.vov.vitamio.mediascannerreceiver" &gt;

            &lt;intent-filter&gt;

                &lt;action android:name="android.intent.action.boot_completed" /&gt;

            &lt;/intent-filter&gt;

                &lt;action android:name="android.intent.action.media_mounted" /&gt;

                &lt;data android:scheme="file" /&gt;

                &lt;action android:name="com.yixia.vitamio.action.media_scanner_scan_file" /&gt;

                &lt;action android:name="com.yixia.vitamio.action.media_scanner_scan_directory" /&gt;

        &lt;/receiver&gt;

        &lt;service

            android:name="io.vov.vitamio.mediascannerservice"

            android:exported="false" &gt;

                &lt;action android:name="io.vov.vitamio.imediascannerservice" /&gt;

        &lt;/service&gt;

            android:name="io.vov.vitamio.vitamioservice"

                &lt;action android:name="io.vov.vitamio.ivitamioservice" /&gt;

[重要]使用Vitamio打造自己的Android萬能播放器(10)—— 本地播放 (縮略圖、視訊資訊、視訊掃描服務)

  代碼說明:

主要是mediascannerservice服務和mediascannerreceiver監聽器的注冊。

2.2.2 啟動掃描服務(mainfragmentactivity)

[重要]使用Vitamio打造自己的Android萬能播放器(10)—— 本地播放 (縮略圖、視訊資訊、視訊掃描服務)

        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);

[重要]使用Vitamio打造自己的Android萬能播放器(10)—— 本地播放 (縮略圖、視訊資訊、視訊掃描服務)

opreference對象封裝了sharedpreferences 存儲資料。這裡判斷了是否首次啟動應用,是的話啟動視訊掃描服務。

2.2.3 擷取資料(fragmentfile) 

[重要]使用Vitamio打造自己的Android萬能播放器(10)—— 本地播放 (縮略圖、視訊資訊、視訊掃描服務)

    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&lt;cursor&gt; oncreateloader(int arg0, bundle arg1) {

        log.e(tag, "oncreateloader");

        return new cursorloader(mparent, video.media.content_uri, projection_media, null, null, order_media_title);

    }

    public void onloadfinished(loader&lt;cursor&gt; arg0, cursor newcursor) {

        log.e(tag, "onloadfinished" + newcursor.getcount());

        madapter.swapcursor(newcursor);

        mlistview.setselectionfromtop(mvisiableposition, mvisiabletop);

    public void onloaderreset(loader&lt;cursor&gt; arg0) {

        log.e(tag, "onloaderreset");

        madapter.swapcursor(null);

[重要]使用Vitamio打造自己的Android萬能播放器(10)—— 本地播放 (縮略圖、視訊資訊、視訊掃描服務)

  代碼說明:

a). fragmentfile繼承了loadercallbacks&lt;cursor&gt;,相關的資料大家可以搜一下。

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。

四、vitamio

已建立vitamio開發者聯盟官方qq群!群号為:246969281

注意:目前僅接受已經開發基于vitamio産品的開發者申請加入,申請理由請填寫産品的名稱和連結!

解碼庫

https://bitbucket.org/abitno/ffmpegandroid

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

五、oplayer

4.1 下載下傳

請移步#taocode(svn):

4.2 更新

a). 移動顯示sd剩餘容量至底部,并在其左邊顯示正在加載的圖示。

b). 保留原fragmentfile為fragmentfildold,新版已經切換至使用vitamio内置的視訊掃描服務。

c). 更換adapter為cursoradapter,同時更新a-z的功能,參加代碼更新。 

d). 新增了preference,用于存儲一般設定資料,例如是否首次啟動。 

六、補充說明

已經在sdk釋出版本裡面強調了許多,這裡再強調一下:

6.1 vitamio相關項目不能同時存在同一個裝置上,也不能與vplayer共存,這是一個已知的bug,下一版本會解決。

6.2 vitamio的示例工程需要在api level14以上編譯,但是最低版本可以支援7以上(android:minsdkversion="7")。可以把values-v11和values-v14兩個檔案夾删除,vitamio在目前項目使用中是相容android2.1以上版本,更低的沒有試過,大家可以試一下。

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

a). 你的網速不行

b). 視訊伺服器不行,或者其帶寬不夠

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

遇到這種情況的時候,如果友善請把視訊測試位址發給我們,并附上簡要說明。([email protected]

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

一般出現這種情況,隻有一個原因:你的裝置上還有其他vitamio的相關項目,參照6.1。 

結束 

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

轉載:http://www.cnblogs.com/over140/archive/2012/07/21/2598729.html