import { ChooseImagePageOrientation, GetVideoInfoSuccess, } from "../../interface.uts" import { UniError_GetVideoInfo, MediaErrorImpl } from "../../unierror.uts" import File from 'java.io.File'; import MediaMetadataRetriever from 'android.media.MediaMetadataRetriever'; import BigDecimal from 'java.math.BigDecimal'; import MediaExtractor from 'android.media.MediaExtractor'; import MediaFormat from 'android.media.MediaFormat'; import TextUtils from 'android.text.TextUtils'; import FileOutputStream from 'java.io.FileOutputStream'; import FileInputStream from 'java.io.FileInputStream'; import InputStream from 'java.io.InputStream'; import UniConfig from 'io.dcloud.uniapp.framework.UniConfig'; const ASSETS_PATH = '/android_asset/' export function getVideoMetadata(src : string) : any { let videoInfo : GetVideoInfoSuccess = { duration: 0, size: 0, height: 0, width: 0 } var path = src var videoFile = new File(src) if(!videoFile.exists()) { path = UTSAndroid.convert2AbsFullPath(src) } if (path.startsWith("/android_asset/")) { var mediaCachePath = UTSAndroid.getAppCachePath() + "uni-media/_" + System.currentTimeMillis() if (copyFile(path, mediaCachePath)) { path = mediaCachePath } else { let error = new MediaErrorImpl(1101010, UniError_GetVideoInfo); return error } } if(!videoFile.exists()) { videoFile = new File(path) } if (!videoFile.exists()) { let error = new MediaErrorImpl(1101003, UniError_GetVideoInfo); return error } videoInfo.size = videoFile.length() / 1024; try { let retriever = new MediaMetadataRetriever() retriever.setDataSource(path) let durationStr : string | null = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION) let width : number | null = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)?.toFloat() let height : number | null = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)?.toFloat() let rotation : string | null = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION) if ("90" == rotation || "270" == rotation) { videoInfo.width = height != null ? height! : 0 videoInfo.height = width != null ? width : 0 } else { videoInfo.width = width != null ? width : 0 videoInfo.height = height != null ? height : 0 } switch (rotation) { case "90": rotation = "right"; break; case "270": rotation = "left"; break; case "180": rotation = "down"; break; default: rotation = "up"; break; } var duration : number = 0 if (durationStr != null) { try { duration = durationStr.toFloat() } catch (e) { } } let big : BigDecimal = BigDecimal.valueOf(duration.toDouble() / 1000).setScale(2, BigDecimal.ROUND_HALF_UP) videoInfo.duration = big.toFloat() videoInfo.orientation = rotation! let mimeType : string | null = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE); videoInfo.type = mimeType let bitrateStr = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); var bitrate : number | null = null try { if (bitrateStr != null) { bitrate = (bitrateStr.toFloat() / 1000).toInt() } } catch (e) { } videoInfo.bitrate = bitrate var fpsNum : number | null = null let fps : string | null = retriever.extractMetadata(32); if (TextUtils.isEmpty(fps)) { let extractor = new MediaExtractor() extractor.setDataSource(path) let trackCount = extractor.getTrackCount(); for (var i = 0; i < trackCount; i++) { let mediaFormat = extractor.getTrackFormat(i.toInt()); let mimeType = mediaFormat.getString(MediaFormat.KEY_MIME); if (!TextUtils.isEmpty(mimeType) && mimeType!!.startsWith("video/")) { let frame = mediaFormat.getInteger(MediaFormat.KEY_FRAME_RATE); fpsNum = frame } } } else { try { fpsNum = Math.ceil(((fps!!).toFloat() / (duration)) * 1000) } catch (e) { } // 沿用1.0设计,向上取整 } videoInfo.fps = fpsNum return videoInfo } catch (e) { let error = new MediaErrorImpl(1101010, UniError_GetVideoInfo); return error } } export function copyFile(fromFilePath : string, toFilePath : string) : boolean { var fis : InputStream | null = null try { if (fromFilePath.startsWith(ASSETS_PATH)) { fis = UTSAndroid.getUniActivity()!.getAssets().open(fromFilePath.replace(ASSETS_PATH, "")); } else { let fromFile = new File(fromFilePath) if (!fromFile.exists()) { return false; } if (!fromFile.isFile()) { return false } if (!fromFile.canRead()) { return false; } fis = new FileInputStream(fromFile); } if (fis == null) { return false } } catch (e) { return false; } let toFile = new File(toFilePath) if (!toFile.getParentFile().exists()) { toFile.getParentFile().mkdirs() } if (!toFile.exists()) { toFile.createNewFile() } try { let fos = new FileOutputStream(toFile) let byteArrays = ByteArray(1024) var c = fis!!.read(byteArrays) while (c > 0) { fos.write(byteArrays, 0, c) c = fis!!.read(byteArrays) } fis!!.close() fos.close() return true } catch (e) { return false; } } /** * 0 LANDSCAPE * 1 PORTRAIT * 2 USER/AUTO */ export function getOrientation(pageOrientation ?: ChooseImagePageOrientation | null) : number { if (pageOrientation == null) { var __uniConfig = getGlobalConfig() if (__uniConfig != null) { var styles = __uniConfig.globalStyle if (styles['pageOrientation'] != null) { pageOrientation = styles['pageOrientation']!.toString() } else { return 1 } } else { return 1 } } switch (pageOrientation!) { case "auto": { return 2 } case "portrait": { return 1 } case "landscape": { return 6 } default: { return 1 } } } function getGlobalConfig() : UniConfig | null { try { var config = Class.forName("io.dcloud.uniapp.framework.IndexKt") if (config != null) { var cc = config.getDeclaredField("__uniConfig") cc.setAccessible(true) return cc.get(null) as UniConfig } else { return null } } catch (e) { return null } }