parent
							
								
									83b9338386
								
							
						
					
					
						commit
						5a31d63d28
					
				| @ -0,0 +1,109 @@ | ||||
| package com.frank.androidmedia.controller | ||||
| 
 | ||||
| import android.graphics.Bitmap | ||||
| import android.graphics.BitmapFactory | ||||
| import android.media.MediaMetadataRetriever | ||||
| import android.util.Log | ||||
| import java.lang.Exception | ||||
| 
 | ||||
| /** | ||||
|  * Retrieve media metadata from video or audio, | ||||
|  * and get thumbnail/frame from video or audio | ||||
|  * @author frank | ||||
|  * @date 2022/3/18 | ||||
|  */ | ||||
| 
 | ||||
| open class MediaMetadataController { | ||||
| 
 | ||||
|     private var title: String? = null | ||||
|     private var duration: Long = 0 | ||||
|     private var bitrate: Int = 0 | ||||
| 
 | ||||
|     private var width: Int = 0 | ||||
|     private var height: Int = 0 | ||||
|     private var frameRate: Float = 0.0f | ||||
| 
 | ||||
|     private var thumbnail: Bitmap? = null | ||||
| 
 | ||||
|     private var mRetriever: MediaMetadataRetriever? = null | ||||
| 
 | ||||
| 
 | ||||
|     fun retrieveMetadata(path: String) { | ||||
|         val retriever = MediaMetadataRetriever() | ||||
|         try { | ||||
|             retriever.setDataSource(path) | ||||
|             title = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE) | ||||
|             if (title != null) { | ||||
|                 Log.i(TAG, "title=$title") | ||||
|             } | ||||
|             val durationStr = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION) | ||||
|             if (durationStr != null) { | ||||
|                 duration = durationStr.toLong() | ||||
|                 Log.i(TAG, "duration=$duration") | ||||
|             } | ||||
|             val bitrateStr = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE) | ||||
|             if (bitrateStr != null) { | ||||
|                 bitrate = bitrateStr.toInt() | ||||
|             } | ||||
|             val widthStr = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH) | ||||
|             if (widthStr != null) { | ||||
|                 width = widthStr.toInt() | ||||
|             } | ||||
|             val heightStr = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT) | ||||
|             if (heightStr != null) { | ||||
|                 height = heightStr.toInt() | ||||
|                 Log.i(TAG, "video width=$width,height=$height") | ||||
|             } | ||||
|             try { | ||||
|                 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { | ||||
|                     val frameRateStr = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CAPTURE_FRAMERATE) | ||||
|                     frameRate = frameRateStr.toFloat() | ||||
|                     Log.i(TAG, "frameRate=$frameRate") | ||||
|                 } | ||||
|             } catch (e: Exception) { | ||||
|                 Log.e(TAG, "retrieve frameRate error=$e") | ||||
|             } | ||||
|             val hasVideoStr = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_VIDEO) | ||||
|             val hasAudioStr = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_AUDIO) | ||||
|             if (hasVideoStr != null && "yes" == hasVideoStr) { | ||||
|                 thumbnail = retriever.getFrameAtTime(0) | ||||
|             } else if (hasAudioStr != null && "yes" == hasAudioStr) { | ||||
|                 val byteArray = retriever.embeddedPicture | ||||
|                 thumbnail = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size, null) | ||||
|             } | ||||
|             if (thumbnail != null) { | ||||
|                 Log.i(TAG, "thumbnail width=${thumbnail?.width}, height=${thumbnail?.height}") | ||||
|             } | ||||
|         } catch (e: Exception) { | ||||
|             Log.e(TAG, "retrieve error=$e") | ||||
|         } finally { | ||||
|             retriever.release() | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     fun initRetriever(path: String) { | ||||
|         mRetriever = MediaMetadataRetriever() | ||||
|         try { | ||||
|             mRetriever?.setDataSource(path) | ||||
|         } catch (e: Exception) { | ||||
|             Log.e(TAG, "initRetriever error=$e") | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     fun getFrameAtTime(timeUs: Long) : Bitmap? { | ||||
|         if (mRetriever == null) | ||||
|             return null | ||||
|         return mRetriever!!.getFrameAtTime(timeUs) | ||||
|     } | ||||
| 
 | ||||
|     fun releaseRetriever() { | ||||
|         if (mRetriever != null) { | ||||
|             mRetriever?.release() | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     companion object { | ||||
|         val TAG: String = MediaMetadataController::class.java.simpleName | ||||
|     } | ||||
| 
 | ||||
| } | ||||
					Loading…
					
					
				
		Reference in new issue