• Stars
    star
    122
  • Rank 292,031 (Top 6 %)
  • Language
    Java
  • License
    MIT License
  • Created over 7 years ago
  • Updated almost 5 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

多媒体元数据兼容方案 - 支持获取图片、视频、音频文件的媒体信息、视频图片缩略图

效果

     图片         音频          视频         自定义

示例APK:example-debug.apk

Gradle

//必选
implementation 'in.xiandan.mmrc:media-metadata-retriever-compat:1.2.0'

//可选,需要Exif支持时必选
implementation 'com.android.support:exifinterface:28.0.0'
//可选,需要FFmpeg支持时必选,全平台约24M
implementation 'com.github.wseemann:FFmpegMediaMetadataRetriever:1.0.14'

//只保留v7a,可降低至3M
ndk {
    abiFilters 'armeabi-v7a'
}

数据源类型

datasource 中预设了一些DataSource,以提供不同的输入源,如果需要自定义数据源,可implements DataSource或参考其它数据源

设置数据源

设置数据源的操作建议放在子线程

MediaMetadataRetrieverCompat mmrc = new MediaMetadataRetrieverCompat();

//设置数据源
mmrc.setDataSource(source);
//设置数据源或抛出异常
mmrc.setDataSourceOrThrow(source);
//设置数据源或抛出异常 并指定检索器
mmrc.setDataSourceOrThrow(source, AndroidMediaMetadataRetrieverFactory.class);

获取Metadata信息

final String width = mmrc.extractMetadata(MediaMetadataKey.WIDTH);

//将值转换为int
final int width = mmrc.extractMetadataInt(MediaMetadataKey.WIDTH, 0);

//将值转换为float
final float width = mmrc.extractMetadataFloat(MediaMetadataKey.WIDTH, 0f);

//将值转换为long
final long width = mmrc.extractMetadataLong(MediaMetadataKey.WIDTH, 0L);

...

获取缩略图

取帧是耗时操作,需要放在子线程,视频有4种取帧方式

//最接近timeUs的关键帧 - 仅视频
MediaMetadataKey.OPTION_CLOSEST_SYNC

//最接近timeUs的帧,不一定是关键帧(性能开销较大) - 仅视频
MediaMetadataKey.OPTION_CLOSEST

//早于timeUs的关键帧 - 仅视频
MediaMetadataKey.OPTION_PREVIOUS_SYNC

//晚于timeUs的关键帧 - 仅视频
MediaMetadataKey.OPTION_NEXT_SYNC
//获取第一帧原尺寸图片
mmrc.getFrameAtTime();

//获取指定毫秒的原尺寸图片 注意这里传的毫秒不再是微秒
mmrc.getFrameAtTime(0, MediaMetadataKey.OPTION_CLOSEST_SYNC);

//获取指定毫秒的缩略图,并基于指定宽高缩放,输出的Bitmap不一定是指定宽高
mmrc.getScaledFrameAtTime(0, MediaMetadataKey.OPTION_CLOSEST_SYNC, 300, 300);

//获取指定毫秒的缩略图,并按指定宽高缩放裁剪,输出的Bitmap一定是指定宽高
mmrc.getCenterCropFrameAtTime(0, MediaMetadataKey.OPTION_CLOSEST_SYNC, 300, 300);

全局配置

//创建一个新的配置构造器
MediaMetadataConfig.newBuilder()
        .setCustomDataSourceCallback(new MediaMetadataConfig.CustomDataSourceCallback() {
            @Override
            public void setCustomDataSource(IMediaMetadataRetriever retriever, DataSource source) {
                //当设置了自定义数据源时 会回调
            }
        })
        //添加格式检查器
        .addFileFormatChecker(new CustomFormatChecker())
        //添加自定义检索器
        .addCustomRetrieverFactory(new SVGMediaMetadataRetrieverFactory())
        .addCustomRetrieverFactory(new CustomMediaMetadataRetrieverFactory())
        .build()
        //应用配置
        .apply();

自定义检索器

custom 演示了以SVG文件为例如何自定义检索器

MediaMetadataConfig.newBuilder()
        .addFileFormatChecker(new CustomFormatChecker())
        .addCustomRetrieverFactory(new SVGMediaMetadataRetrieverFactory())
        .build()
        .apply();

相关资料

fresco/imageformat
FFmpegMediaMetadataRetriever
MediaMetadataRetriever
ImageDecoder
ExifInterface

More Repositories

1

magnetW

[已失效,不再维护]
JavaScript
11,851
star
2

CountDownTimerSupport

Android倒计时器,支持开始倒计时、暂停倒计时、继续倒计时、停止倒计时、重新倒计时
Java
196
star
3

LoadingBar

极简使用的解耦Loading组件
Java
182
star
4

github-tags

给Github项目添加标签的Chrome插件,支持按标签搜索,支持数据云同步
CSS
36
star
5

ItemTouchMoveHelper

RecyclerView的Item滑动触摸辅助类,可以用来实现微信里的表情商店预览功能
Java
32
star
6

AssetFile

像File一样操作Assets资源 - https://blog.csdn.net/aa464971/article/details/82740299
Java
20
star
7

ActivityManager

一个管理所有Activity的库,可以任意处关闭任意Activity
Java
20
star
8

PanelKeyboardCompat

在XhsEmoticonsKeyboard的基础上进行了改进并提高了兼容性和易用性
Java
15
star
9

GlidePlus

基于glide与android-gif-drawable对Glide处理Gif进行加强
Java
12
star
10

keystore-browser

查看keystore信息和apk签名信息的图形化工具,支持Windows、Mac
JavaScript
11
star
11

webp-spring

webp转换器
Java
11
star
12

Chrome-Plugin

开发者必备的一些Chrome浏览器插件
8
star
13

retrofit-rxjava-okhttp

Retrofit-RxJava-OkHttp二次封装
Java
8
star
14

YouTubeDownload

分享一些下载YouTube视频的网站和工具
8
star
15

AndroidViewHelper

View和RecyclerView的辅助类
Java
7
star
16

SimpleRecyclerAdapters

简易的RecyclerView Adapter
Java
5
star
17

PreRecyclerView

HeaderView、加载更多的RecyclerView
Java
5
star
18

simple-wx-push

简易版推送消息到自己微信
JavaScript
5
star
19

SmartPay

高扩展性的Android聚合支付
Java
5
star
20

instagram-login-android

基于OAuth API对Instagram的授权登录封装成SDK
Java
4
star
21

okdownload-ext

收集okdownload一些问题,用于快速解决使用okdownload时的一些问题
Java
4
star
22

Android-Studio-Plugin

Android Studio上一些实用的插件 - http://blog.csdn.net/aa464971/article/details/70325399
3
star
23

RxUmeng

将友盟sdk封装成RxJava的调用方式
Java
2
star
24

xiandanin.github.io

https://xiandan.in/
HTML
2
star
25

SpringSample

Spring HelloWorld - https://blog.csdn.net/aa464971/article/details/78250259
Java
2
star
26

plugin-wifi-password

查看连接过的wifi密码
Java
2
star
27

FrescoSample

Fresco的官方例子,比原工程更好编译
Java
2
star
28

CameraX

CameraX源码
Java
2
star
29

ffmpeg-android-build

编译后的ffmpeg-android
C
2
star
30

android-fileexplorer-nodejs

简易版的导出Android设备文件的跨平台客户端
JavaScript
2
star
31

SVGShapeLayout

可以将任何View显示成SVG的形状,支持描边、阴影
Java
2
star
32

AnyCost

全局耗时计算器,可以在任何地方计算耗时
Kotlin
1
star
33

libyuv-jni

libyuv的jni实现
C++
1
star
34

webp-java

webp命令行java版
Java
1
star
35

SimpleAudioPlayer

基于系统播放器封装的全局音频播放器
Java
1
star
36

SquareGridLayout

微博九宫格
Java
1
star
37

pdf2ppt

nodejs pdf转ppt
JavaScript
1
star
38

OpenSourceLicense4Wechat

帮助你选择开源许可证的微信小程序
JavaScript
1
star
39

AndroidCompat

Android API的适配
Java
1
star
40

ViewVisibleHelper

用来计算View可见程度,还提供了OnScrollListener,可用于列表自动播放
Java
1
star
41

CameraPermissionCompat

Android相机权限检测兼容
Java
1
star
42

SplashCompatSample

启动页适配例子 - https://blog.csdn.net/aa464971/article/details/86692198
Java
1
star
43

RangeTimelineView

Android范围选择器
Java
1
star