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