一.MediaMetadataRetriever API
android.media
Class MediaMetadataRetriever
java.lang.Object
extended by android.media.MediaMetadataRetriever
--------------------------------------------------------------------------------
public class MediaMetadataRetriever extends Object MediaMetadataRetriever class <span style="font-family: Arial, Helvetica, sans-serif;">provides a unified interface for retrieving frame and meta data from an input media file.</span>
该类提供了一个统一的接口,用来从输入的媒体文件中获取帧和元数据。
API的方法
二.API使用demo
String dataPath = Environment.getExternalStorageDirectory() + "/gym.mp4";
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(dataPath);
// 取得视频的长度(单位为毫秒)
String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
// 转换单位为秒)
int seconds = Integer.valueOf(time) / 1000;
// 得到每一秒时刻的bitmap比如第一秒,第二秒
for (int i = 1; i <= seconds; i++) {
Bitmap bitmap = retriever.getFrameAtTime(i * 1000 * 1000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
String path = Environment.getExternalStorageDirectory() + File.separator + i + ".jpg";
FileOutputStream fos = null;
try {
fos = new FileOutputStream(path);
bitmap.compress(CompressFormat.JPEG, 80, fos);
fos.close();
} catch (Exception e) {
}
public Bitmap getFrameAtTime(long timeUs, int option) {
if (option < OPTION_PREVIOUS_SYNC ||
option > OPTION_CLOSEST) {
throw new IllegalArgumentException("Unsupported option: " + option);
}
return _getFrameAtTime(timeUs, option);
}
获取帧的方法中,有两个参数,很明显第一个是视频的时间。文档对这个参数的解释是:
方法将返回在资源文件中这个时间位置的帧。传入的时间在资源文件上不能保证一定会有对应的帧,当有这种情况发生的时候,最近的帧将会作为结果返回。如果该值为负值,long timeUs, int option将会无效,任何被认为可以代表资源的帧都有可能被返回(不确定性)。
获取到帧后,调用BitMap的compress方法将帧压缩成图。