欢迎访问个人博客:https://glumes.com
在做多媒体应用开发时,往往需要获取到多媒体文件的相关信息。
Android 提供了 MediaMetadataRetriever
类来获取输入媒体文件的帧(Frame)和元数据(Meta data)。
使用起来比较简单,所以使用范围也有限制,步骤如下:
1、声明并初始化 MediaMetadataRetriever 类。
2、设置数据源
3、获取想要的信息
MediaMetadataRetriever metadataRetriever = new MediaMetadataRetriever();
metadataRetriever.setDataSource(AUDIO_FILE);
// 获得时长
metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)
// 获得名称
metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE)
// 获得媒体类型
metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE)
// 获得码率
metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE)
使用 extractMetadata 方法就能获得很多相关信息了,具体到哪些内容可以参考源码里面列举的常量。
除此之外,对于音频和视频文件还能获取其他的一些内容。
获取音频相关信息
对于音频文件,比如 MP3 文件,我们还可以获取到 MP3 的专辑图像。
byte[] imageData = metadataRetriever.getEmbeddedPicture();
try {
mBinding.audioCover.setImageBitmap(BitmapFactory.decodeByteArray(imageData, 0, imageData.length));
} catch (Exception e) {
}
使用 getEmbeddedPicture
方法可以获取到图像的字节数组,再解码到图像就好了。
获取视频的帧图像
对于视频文件,比如 MP4 文件,还可以获取到 MP4 文件的某个时刻的一帧图像。
videoFrame.setImageBitmap(metadataRetriever.getFrameAtTime(1*1000*1000, MediaMetadataRetriever.OPTION_NEXT_SYNC))
使用 getFrameAtTime
方法即可,传入具体的某个时刻的参数,第二个参数是获取帧的选项。
对于时刻参数要注意的是:单位是微秒
,而不是我们常用的毫秒。而通过 extractMetadata 方法得到的多媒体文件时间长度 duration 单位却是毫秒。
对于第二个参数获取帧的选项,有如下几种:
- OPTION_PREVIOUS_SYNC
- OPTION_NEXT_SYNC
- OPTION_CLOSEST_SYNC
- OPTION_CLOSEST (性能较差)
主要差别就是在获取指定时间点前还是后。因为在指定时间点不一定有对应的帧。
用了这个方法, 就可以做到获取 MP4 文件任意时间点的帧图像了。
代码参考 Github 地址
限制
原生的 MediaMetadataRetriever
还是有不少限制的,比如支持的多媒体文件格式少,而且还不能支持网络链接的多媒体文件。
这个时候,就可以推荐使用了开源的 FFmpegMediaMetadataRetriever
库,基于 FFmpeg 开发的。使用的接口如安卓原生一致,但功能更强大了。
对于视频帧的补充
1、视频帧率
每秒显示的帧数 FPS。
2、帧数
一秒钟时间里传输的图片的量,也可以理解为图形处理器每秒钟能够刷新几次。
每一帧都是静止的图像。快速连续地显示帧便形成了运动的假象。
3、码率
在压缩视频时给这个视频指定一个参数,用以告诉压缩软件期望的压缩后的视频的大小。
比特率是指每秒传送的比特数。单位为 bps,比特率越高,传送的数据速度越快。
一起交流学习,答疑解惑,有问题,我们星球见~~~
觉得文章还不错,可以关注一下微信公众号【纸上浅谈】