[Unity] Unity获得Android的视频缩略图

在Android平台上,做了一个JAR给Unity使用。

    public static byte[] CreateThumbnail(String videoPath, int kind) {
        if(kind != 3 && kind != 1) {
            kind = 3;
        }

        Bitmap bmpt = ThumbnailUtils.createVideoThumbnail(videoPath, kind);
        if(bmpt != null) {
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bmpt.compress(CompressFormat.PNG, 100, stream);
            return stream.toByteArray();
        } else {
            return new byte[0];
        }
    }

在Unity中直接调用CreateThumbnail即可。

public void Call_GetAllVideoPaths()
        {
            try
            {
                AndroidJavaClass mediaClass = new AndroidJavaClass("android.provider.MediaStore$Video$Media");
                AndroidJavaClass thumbnailsClass = new AndroidJavaClass("android.provider.MediaStore$Video$Thumbnails");

                string idTag = mediaClass.GetStatic<string>("_ID");  // "_id"
                string dataTag = mediaClass.GetStatic<string>("DATA");  // "_data"
                string titleTag = mediaClass.GetStatic<string>("TITLE");//  "title"
                string mimeTypeTag = mediaClass.GetStatic<string>("MIME_TYPE"); // "mime_type"

                string thumNailDataTag = thumbnailsClass.GetStatic<string>("DATA");
                string videoTag = thumbnailsClass.GetStatic<string>("VIDEO_ID"); // "video_id" The original image for the thumbnal

                int thumbKindMicro = thumbnailsClass.GetStatic<int>("MICRO_KIND");
                int thumbKindMini = thumbnailsClass.GetStatic<int>("MINI_KIND");

                string[] thumbColumns = { thumNailDataTag, videoTag };  // MediaStore.Video.Thumbnails.DATA, MediaStore.Video.Thumbnails.VIDEO_ID
                string[] mediaColumns = { idTag, dataTag, titleTag, mimeTypeTag }; // MediaStore.Video.Media._ID, MediaStore.Video.Media.DATA, MediaStore.Video.Media.TITLE,MediaStore.Video.Media.MIME_TYPE

                AndroidJavaClass player = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                AndroidJavaObject currentActivity = player.GetStatic<AndroidJavaObject>("currentActivity");

                string[] urisToSearch = new string[] { "EXTERNAL_CONTENT_URI", "INTERNAL_CONTENT_URI" };
                foreach (string uriToSearch in urisToSearch)
                {
                    AndroidJavaObject thExternalUri = thumbnailsClass.GetStatic<AndroidJavaObject>(uriToSearch);
                    AndroidJavaObject externalUri = mediaClass.GetStatic<AndroidJavaObject>(uriToSearch);
                    AndroidJavaObject finder = currentActivity.Call<AndroidJavaObject>("managedQuery", externalUri, mediaColumns, null, null, null);
                    bool foundOne = finder.Call<bool>("moveToFirst");
                    while (foundOne)
                    {
                        VRLocalVideoInfo videoInfo = new VRLocalVideoInfo();

                        int idIndex = finder.Call<int>("getColumnIndex", idTag);
                        int idValue = finder.Call<int>("getInt", idIndex);

                        int mediaDataIndex = finder.Call<int>("getColumnIndex", dataTag);
                        string mediaData = finder.Call<string>("getString", mediaDataIndex);

                        int titleIndex = finder.Call<int>("getColumnIndex", titleTag);
                        string titleValue = finder.Call<string>("getString", titleIndex);

                        int mimeIndex = finder.Call<int>("getColumnIndex", mimeTypeTag);
                        string mimeType = finder.Call<string>("getString", mimeIndex);
                        Debug.Log("Chindy: file id + media file data + title + mime type: " 
                            + idValue + mediaData + titleValue + mimeType);
                        
                        Texture2D thumbnailTexture = null;
                        AndroidJavaObject thumbFinder = currentActivity.Call<AndroidJavaObject>("managedQuery",
                            thExternalUri, thumbColumns, videoTag + "=" + idValue, null, null);
                        if (thumbFinder.Call<bool>("moveToFirst"))
                        {
                            int dataIndex = thumbFinder.Call<int>("getColumnIndex", thumNailDataTag);
                            string thumbData = thumbFinder.Call<string>("getString", dataIndex);
                            Debug.Log("Chindy: get thumb data: " + thumbData);

                            videoInfo.m_thumbPath = @"file:///" + thumbData;
                            //thumbnailTexture = LoadThumbnailImage(videoInfo.m_thumbPath, videoInfo);

                            WWW www = new WWW(videoInfo.m_thumbPath);
                            if (www != null && string.IsNullOrEmpty(www.error))
                            {
                                m_tempTexture = www.texture;
                            }
                            else
                            {
                                Debug.Log("Chindy: load loca Media error " + www.error);
                            }

                            thumbnailTexture = m_tempTexture;
                        }
                        else
                        {
                            // Create the thumbnail image if there is no default one
                            thumbnailTexture = CreateThumbnailImage(mediaData, thumbKindMicro);
                            Debug.Log("Chindy: create thumb data.");
                            
                            videoInfo.m_thumbPath = @"file:///";
                        }

                        if (thumbnailTexture == null)
                        {
                            Debug.Log("Chindy: can't create thumbnail image for this video.");
                            thumbnailTexture = m_defaultThumbnail.texture;
                        }

                        videoInfo.m_filePath = @"file:///" + mediaData;
                        videoInfo.m_title = titleValue;
                        videoInfo.m_mineType = mimeType;
                        videoInfo.m_thumbTexture = thumbnailTexture;
                        videoInfo.m_id = idValue;

                        m_videoItems.Add(videoInfo);

                        // if (allowedExtesions.Contains(Path.GetExtension(data).ToLower()))
                        foundOne = finder.Call<bool>("moveToNext");
                    }
                }
            }
            catch (System.Exception /*e*/)
            {
                // do something with error...
            }
        }



猜你喜欢

转载自blog.csdn.net/chindy/article/details/74348130