android显示视频预览

android 11 kotlin显示视频预览

权限

读sd卡中的mp4文件的权限

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

代码

   fun showVideo() {
   		// 比如显示sdcard对应app的data中的kongfu.mp4
        val video: String = getExternalFilesDir("")!!.getAbsolutePath() + "/kongfu.mp4"
        val file: File = File(video)
        if (!file.exists()) {
            Log.e(TAG, "file:${video} not exists")
            return
        }

        lifecycleScope.launch(Dispatchers.Main) {
            val firstFrame = getFirstFrameDrawable(video)
            if (firstFrame != null) {
            	// iv_first_frame是一个ImageView
                iv_first_frame.setVisibility(View.VISIBLE)
                iv_first_frame.setImageBitmap(firstFrame)
            }
        }
    }

    /**
     * 获取视频的第一帧,耗时的操作, 不建议直接在主线程上调用,这里放在协程中处理
     *
     * @param url
     * @return
     */
    private suspend fun getFirstFrameDrawable(url: String): Bitmap? {
        val mmr = MediaMetadataRetriever()
        Log.d(TAG, "video_url = $url")
        return try {
            mmr.setDataSource(url)
            mmr.frameAtTime
        } catch (e: Exception) {
            e.printStackTrace()
            null
        }
    }

	// 取视频中某个播放位置的图片,单位为毫秒
    private suspend fun getFrameDrawable(url: String, millisPosition: Long): Bitmap? {
        val mmr = MediaMetadataRetriever()
        return try {
            mmr.setDataSource(url)
            mmr.getFrameAtTime(millisPosition)
        } catch (e: Exception) {
            e.printStackTrace()
            null
        }
    }

可能出错点

如果这么调 mmr.setDataSource(url, HashMap())
会提示如下错误:
android java.lang.RuntimeException: setDataSource failed: status = 0xFFFFFFEA

作者:帅得不敢出门

你可能感兴趣的:(Android平台,android,音视频,java)