音视频开发系列——全面了解Android MediaMetadataRetriever
Posted 伯努力不努力
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了音视频开发系列——全面了解Android MediaMetadataRetriever相关的知识,希望对你有一定的参考价值。
MediaMetadataRetriever在android实践中的作用非常广泛。
主要使用场景
更多音视频知识请关注公众号:进击的代码家
主要有以下几个实际应用场景:
1.获取音视频文件的元数据信息
MediaMetadataRetriever可以用于获取音频或视频文件的元数据信息,例如歌曲名称、演唱者、专辑封面、时长、帧率、分辨率等等。这些元数据信息可以用于实现音视频播放器、音乐播放器、视频编辑器等应用程序中的各种功能。
2.实现视频缩略图
MediaMetadataRetriever可以用于获取指定时间点的视频帧,可以用于实现视频缩略图的功能。一般来说,我们可以在视频列表或者视频播放进度条上显示视频缩略图,用户可以通过缩略图快速地浏览视频内容。
3.实现音乐封面显示
MediaMetadataRetriever可以用于获取音频文件的专辑封面图片,如果音频文件中包含有专辑封面信息的话。一般来说,我们可以在音乐播放器上显示专辑封面图片,让用户可以更加直观地了解当前播放的音乐。
4.实现视频截图
MediaMetadataRetriever可以用于获取指定时间点的视频帧,我们可以将获取到的视频帧保存为图片文件,实现视频截图的功能。这个功能可以应用在视频编辑器、视频播放器、视频直播等应用程序中。
需要注意的是,MediaMetadataRetriever只能用于读取已经完成的音视频文件,无法用于实时处理音视频数据流。因此,如果需要实时处理音视频数据流,可以使用其他的音视频处理库,例如FFmpeg、MediaCodec等。
主要Api介绍
1.setDataSource(String path)
该方法用于设置MediaMetadataRetriever要提取信息的数据源,path可以是本地文件路径或者网络URL地址。例如:
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource("/sdcard/test.mp4");
2.extractMetadata(int keyCode)
该方法用于提取指定的元数据信息,参数keyCode可以是预定义的一些常量,例如METADATA_KEY_TITLE表示音频的标题,METADATA_KEY_ARTIST表示音频的演唱者等等。例如:
String title = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
String artist = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
其中,参数keyCode代表要提取的元数据信息类型,可以是预定义的一些常量值,也可以是自定义的键值。以下是一些常见的元数据信息类型及其对应的常量值:
例如,要提取音频文件的歌曲名称,可以使用如下代码:
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(audioFilePath);
String title = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
该方法返回一个字符串,表示对应元数据信息的值。需要注意的是,不是所有的音视频文件都包含有所有的元数据信息,如果要提取的元数据信息不存在,该方法会返回null。
除了上述预定义的元数据信息类型,我们还可以自定义键值来存储和读取自定义的元数据信息。例如,我们可以使用如下代码来存储和读取一个自定义键值:
// 存储自定义键值
retriever.extractMetadata(MY_KEY) = "my value";
// 读取自定义键值
String myValue = retriever.extractMetadata(MY_KEY);
需要注意的是,自定义键值必须使用以小写字母“x-”开头的字符串,例如“x-my-key”,以避免与其他预定义的元数据信息类型冲突。
3.getFrameAtTime(long timeUs, int option)
getFrameAtTime方法用于获取音视频文件中的一帧画面,可以用于实现缩略图、视频预览等功能。该方法的原型如下:
public Bitmap getFrameAtTime (long timeUs, int option)
其中,参数timeUs代表要获取的画面对应的时间戳(单位:微秒),可以通过extractMetadata方法获取音视频文件的时长,从而计算出需要获取的时间戳。参数option用于指定获取画面的选项,常用的选项包括:
OPTION_CLOSEST:获取离指定时间戳最近的一帧画面
OPTION_CLOSEST_SYNC:获取离指定时间戳最近的一帧关键帧(I帧)画面
OPTION_PREVIOUS_SYNC:获取指定时间戳之前最近的一个关键帧画面
OPTION_NEXT_SYNC:获取指定时间戳之后最近的一个关键帧画面
例如,要获取视频文件中第5秒的一帧画面,可以使用如下代码:
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(videoFilePath);
long timeUs = 5000000; // 5秒的时间戳
Bitmap bitmap = retriever.getFrameAtTime(timeUs, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
该方法返回一个Bitmap对象,表示获取到的画面。需要注意的是,如果要获取的时间戳不在视频文件的时间范围内,该方法会返回null;如果获取画面失败,也会返回null。
在实际应用中,可以将获取到的Bitmap对象设置给ImageView或其他控件,以实现视频预览或缩略图功能。需要注意的是,由于该方法的实现是通过解码视频帧来获取画面,因此在频繁调用该方法时,可能会产生较大的性能开销。可以考虑使用缓存等方式来优化性能。
4.getEmbeddedPicture()
该方法用于获取专辑封面图片,如果音频文件中包含有专辑封面信息的话。该方法返回一个byte数组,可以将其转换为Bitmap对象进行显示。例如:
byte[] bytes = retriever.getEmbeddedPicture();
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
5.setDataSource(FileDescriptor fd)
该方法用于设置数据源为一个FileDescriptor,可以用于从assets目录或者raw资源中读取多媒体文件。例如:
AssetFileDescriptor afd = getAssets().openFd("test.mp4");
FileDescriptor fd = afd.getFileDescriptor();
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(fd);
需要注意的是,MediaMetadataRetriever只能用于读取已经完成的音视频文件,无法用于实时处理音视频数据流。
以上是关于音视频开发系列——全面了解Android MediaMetadataRetriever的主要内容,如果未能解决你的问题,请参考以下文章
音视频开发系列——全面了解Android MediaExtractor
音视频开发系列——全面了解Android Surfaceview