MediaMetadataRetriever的使用 (一) 获取视频正确宽高的小问题

看我的 ffmpeg 命令 :

val cmd = "-y -ss " + start + " -t " + trimmer + " -i " + inputVideoPath + " -strict -2 -vcodec libx264 -preset ultrafast " + "-crf 24 -acodec aac -ar 44100 -ac 2 -b:a 96k -s " + endWH[0] + "x" + endWH[1] + " " + outputVideoPath

其中 endWH 是 int 数组:

var width = retr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH).toInt()
var height = retr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT).toInt()

val endWH = getRatioWH(width, height) // 等比缩放

事实上 MediaMetadataRetriever 这个类,他是无法灵活的判断出在不同方向上(横/竖屏)正确的宽高的,在我不断的尝试中发现 MediaMetadataRetriever 它默认较长的一边是 宽,短的边是高,也就是扁长形的矩形。

这样的话,横屏的视频自然是没有问题的,但是竖屏的视频就会在压缩的过程中变形。

解决办法:

  1. 通过获取到视频第一帧的图片的宽高,来决定视频压缩的宽高,如下伪代码:
 val bitmap = mediaMetadataRetriever.getFrameAtTime(start1 + 1L, MediaMetadataRetriever.OPTION_CLOSEST_SYNC)
 ......
 getCommand(params..., mCoverBitmap!!.width, mCoverBitmap!!.height)

如上代码经我不完全测试,是诚实可用的,这算是取巧,不过因为我这边反正需要一张封面图,所以就不需要再去通过视频本身来处理宽高的问题了。

  1. 通过获取到视频的方向,得到正确的宽高,如下:
var width = retr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH).toInt()
var height = retr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT).toInt()
val orientation = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION);
if ("90".equals(orientation)) {
       width = min
       height = max 
   } else {
       width = max
       height = min
   }  

其中,当视频是竖屏的时候 orientation = 90,横屏 orientation = 0
如上我需要的宽高的逻辑如上。

你可能感兴趣的:(开发日常)