在做多媒体应用开发时,往往需要获取到多媒体文件的相关信息。
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 单位却是毫秒。
对于第二个参数获取帧的选项,有如下几种:
主要差别就是在获取指定时间点前还是后。因为在指定时间点不一定有对应的帧。
用了这个方法, 就可以做到获取 MP4 文件任意时间点的帧图像了。
代码参考 Github 地址
原生的 MediaMetadataRetriever
还是有不少限制的,比如支持的多媒体文件格式少,而且还不能支持网络链接的多媒体文件。
这个时候,就可以推荐使用了开源的 FFmpegMediaMetadataRetriever
库,基于 FFmpeg 开发的。使用的接口如安卓原生一致,但功能更强大了。
1、视频帧率
每秒显示的帧数 FPS。
2、帧数
一秒钟时间里传输的图片的量,也可以理解为图形处理器每秒钟能够刷新几次。
每一帧都是静止的图像。快速连续地显示帧便形成了运动的假象。
3、码率
在压缩视频时给这个视频指定一个参数,用以告诉压缩软件期望的压缩后的视频的大小。
比特率是指每秒传送的比特数。单位为 bps,比特率越高,传送的数据速度越快。