在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... } }