`

2011.09.27——— android 视频缩略图之MediaMetadataRetriever

阅读更多
2011.09.27——— android 视频缩略图之MediaMetadataRetriever

参考:http://www.ophonesdn.com/forum/thread-2973-1-1.html
http://topic.csdn.net/u/20100315/10/2726b427-ca14-4e06-bd44-a6a351f8c52a.html
http://www.pin5i.com/showtopic-android-generate-thumbnails-for-multimedia-files.html
1、
2.2之后 获得缩略图就简单了 因为用了ThumbnailUtils类,可以

Bitmap  b = ThumbnailUtils.createVideoThumbnail(path,Video.Thumbnails.MICRO_KIND);
ImageView iv = new ImageView(this);

参见:http://lipeng88213.iteye.com/blog/835183

2、
但是2.2之前呢 这个问题就比较郁闷了 查了查资料
其实 我们可以用MediaMetadataRetriever这个类

但是 里面有个问题
1.0之后 这个类被隐藏了 貌似2.3之后这个类又出现了吧

隐藏了。。。。那怎么办呢?别慌 我们自有办法  步骤如下:

一、找到MediaMetadataRetriever的源码 复制到你的工程里面去

切忌:包名必须与MediaMetadataRetriever本身在系统里面的包名一样,也就是包名必须为android.media





二、找到so文件 新建一个和src同级别的libs文件夹 把so文件复制进去 这个so文件的名字大概为libmedia_jni.so




可能有人要问 如何获得so文件呢 方法有两个
A:如果你有android的系统源码 你直接可以搜索libmedia_jni.so 就能得到
B:在androidsdk目录——tools——ddms.bat 启动ddms



Device——File Explore
打开一个文件浏览器



system——lib——libmedia_jni.so




三、
这样之后 你就可以用MediaMetadataRetriever类了

MediaMetadataRetriever主要有两个功能:MODE_GET_METADATA_ONLY和MODE_CAPTURE_FRAME_ONLY

mode为MODE_CAPTURE_FRAME_ONLY时
调用captureFrame取得一帧。
mode为MODE_GET_METADATA_ONLY时
extractMetadata 提取文件信息,ARTIST、DATE、YEAR、DURATION、RATING、FRAME_RATE、VIDEO_FORMAT 可以得到时长等信息
和extractAlbumArt 提取专辑信息,这个下面的音乐文件可以用到。


代码如下:
获得缩略图
private Bitmap createVideoThumbnail(String filePath) {
        Bitmap bitmap = null;
        android.media.MediaMetadataRetriever retriever = new android.media.MediaMetadataRetriever();
        
        try {
            retriever.setMode(android.media.MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY);
            retriever.setDataSource(filePath);
            bitmap = retriever.captureFrame();
        } catch(IllegalArgumentException ex) {
            // Assume this is a corrupt video file
        } catch (RuntimeException ex) {
            // Assume this is a corrupt video file.
        } finally {
            try {
                retriever.release();
            } catch (RuntimeException ex) {
                // Ignore failures while cleaning up.
            }
        }
        return bitmap;
    }


获得时长   
   
private String ttt(String filePath){
    	android.media.MediaMetadataRetriever retriever = new android.media.MediaMetadataRetriever();
    	retriever.setMode(android.media.MediaMetadataRetriever.MODE_GET_METADATA_ONLY);
    	retriever.setDataSource(filePath);
    	String str = retriever.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_DURATION);
        System.out.println(str +"  =====");
        return str;
    }



代码见附件


另外:

我同事有一个获得缩略图另辟蹊径的方法 大致思路如下
偷偷的将视频播放0.1秒 然后通过VideoView.getDrawingCache()方法 来获得缓存的图片 这个就可以为视频的缩略图
此方法可行!





  • 大小: 10.9 KB
  • 大小: 6.9 KB
  • 大小: 36.5 KB
  • 大小: 27.8 KB
  • 大小: 106.1 KB
分享到:
评论
7 楼 lipeng88213 2013-07-31  
whsky 写道
上面的错误没解决?

这个是很早之前用过的,之后我也没用了 要不你找下其他方法吧
6 楼 whsky 2013-07-29  
上面的错误没解决?
5 楼 xiaopanp 2013-02-02  
02-02 17:31:50.120: E/AndroidRuntime(24849): java.lang.NoSuchMethodError: android.media.MediaMetadataRetriever.setMode
02-02 17:31:50.120: E/AndroidRuntime(24849): at com.lp.MainActivity.createVideoThumbnail(MainActivity.java:35)
02-02 17:31:50.120: E/AndroidRuntime(24849): at com.lp.MainActivity.onCreate(MainActivity.java:21)
02-02 17:31:50.120: E/AndroidRuntime(24849): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-02 17:31:50.120: E/AndroidRuntime(24849): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1618)
02-02 17:31:50.120: E/AndroidRuntime(24849): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1670)
02-02 17:31:50.120: E/AndroidRuntime(24849): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-02 17:31:50.120: E/AndroidRuntime(24849): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-02 17:31:50.120: E/AndroidRuntime(24849): at android.os.Handler.dispatchMessage(Handler.java:99)
02-02 17:31:50.120: E/AndroidRuntime(24849): at android.os.Looper.loop(Looper.java:123)
02-02 17:31:50.120: E/AndroidRuntime(24849): at android.app.ActivityThread.main(ActivityThread.java:3695)
02-02 17:31:50.120: E/AndroidRuntime(24849): at java.lang.reflect.Method.invokeNative(Native Method)
02-02 17:31:50.120: E/AndroidRuntime(24849): at java.lang.reflect.Method.invoke(Method.java:507)
02-02 17:31:50.120: E/AndroidRuntime(24849): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-02 17:31:50.120: E/AndroidRuntime(24849): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-02 17:31:50.120: E/AndroidRuntime(24849): at dalvik.system.NativeStart.main(Native Method)
4 楼 a379933101 2012-08-13  
好人啊,非常感谢
3 楼 iverson03 2012-07-23  
我也出现上述错误。求解......
2 楼 huangzubin13 2012-07-11  
远行报错
I/System.out(13902): /mnt/sdcard
D/AndroidRuntime(13902): Shutting down VM
W/dalvikvm(13902): threadid=1: thread exiting with uncaught exception (group=0x40015560)
E/AndroidRuntime(13902): FATAL EXCEPTION: main
E/AndroidRuntime(13902): java.lang.NoSuchMethodError: android.media.MediaMetadataRetriever.setMode
E/AndroidRuntime(13902): at com.lp.MainActivity.createVideoThumbnail(MainActivity.java:35)
E/AndroidRuntime(13902): at com.lp.MainActivity.onCreate(MainActivity.java:21)
E/AndroidRuntime(13902): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime(13902): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
E/AndroidRuntime(13902): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
E/AndroidRuntime(13902): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
E/AndroidRuntime(13902): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
E/AndroidRuntime(13902): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(13902): at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime(13902): at android.app.ActivityThread.main(ActivityThread.java:3683)
E/AndroidRuntime(13902): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(13902): at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime(13902): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
E/AndroidRuntime(13902): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
E/AndroidRuntime(13902): at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager(  104):   Force finishing activity com.lp/.MainActivity
W/ActivityManager(  104):   Force finishing activity com.android.settings/.DevelopmentSettings
W/ActivityManager(  104): Scheduling restart of crashed service com.duomi.android/com.duomi.app.player.DMMusicService in 33436ms
W/ActivityManager(  104): Activity pause timeout for HistoryRecord{406403e0 com.lp/.MainActivity}
D/AudioHardware(12450): AudioHardware pcm playback is exiting standby.
D/AudioHardware(12450): openPcmOut_l() mPcmOpenCnt: 0
I/Process (13902): Sending signal. PID: 13902 SIG: 9
1 楼 huangzubin13 2012-07-11  
膜拜lz 

相关推荐

    通过视频地址获取视频缩略图

    2. **获取方法**:获取视频缩略图的方法通常有两种——客户端解析和服务器端处理。客户端解析是指在用户的设备上(如浏览器或移动应用)解析视频信息并提取缩略图;服务器端处理则是在服务器上完成这个过程,然后将...

    加载网络视频缩略图

    在Android开发中,加载网络视频缩略图是一个常见的需求,特别是在设计媒体播放应用或者涉及到视频内容展示的场景。本文将详细解析如何实现这个功能,并基于提供的文件名“加载网络视频作为图片”进行深入讨论。 ...

    android 根据指定路径获取本地视频列表显示,点击缩略图调用系统播放器进行播放

    Android提供了一个名为`MediaMetadataRetriever`的类,可以用来从视频中提取帧作为缩略图。调用`setDataSource()`设置视频文件路径,然后使用`getFrameAtTime()`方法获取一帧图片,可以设定时间点以获取最具代表性的...

    thumbnails-android 获取视频还有图片的缩略图

    在Android开发中,获取视频和图片的缩略图是一项常用的功能,这有助于在应用中快速预览媒体内容,提升用户体验。下面将详细讲解如何在Android系统中实现这一目标。 首先,我们来了解一下“缩略图”(thumbnails)的...

    安卓获取视频文件的缩略图

    在Android平台上,获取视频文件的缩略图是开发者经常遇到的需求。这主要涉及到多媒体处理,尤其是视频帧的提取。在本教程中,我们将探讨如何在Android应用中实现这一功能,同时利用JieCao(杰操)播放器库来辅助完成...

    android获取视频缩略图

    在Android开发中,获取视频缩略图是一项常见的需求,例如在视频列表中预览视频内容。Android系统提供了多种方法来实现这一功能,本篇将详细讲解如何异步方式获取视频缩略图,并分享一个亲测可行的方法。 首先,...

    android录制视频,缩略图播放视频

    在Android平台上,录制和播放视频以及生成缩略图是常见的功能需求,对于开发者来说,理解和掌握这些技术至关重要。本文将详细讲解如何实现这些功能,并提供相关的编程知识点。 首先,我们来探讨如何录制视频。...

    安卓直播视频播放流媒体IPCameraRTSPDLNA相关-视频缩略图和显示的缓存异步机制.zip

    在安卓中,可以使用MediaMetadataRetriever类来获取视频的关键帧作为缩略图。为了提高性能,这一过程通常会在后台线程中异步执行,避免阻塞主线程导致应用卡顿。 显示的缓存异步机制主要涉及到内存和磁盘缓存策略。...

    安卓获取视频缩略图

    本篇文章将深入探讨如何在Android系统中获取本地视频的缩略图,并且展示如何利用列表视图(ListView)或者网格视图(GridView)来显示这些缩略图。 首先,我们需要了解Android提供了一个名为`...

    Android获取图片、视频缩略图

    在Android开发中,获取图片和视频的缩略图是一项常见的需求,这通常涉及到用户界面的展示,例如在相册应用中预览媒体内容。本文将详细介绍如何在Android中有效地获取这两种类型的媒体文件的缩略图。 一、图片缩略图...

    android 录制视频并生成缩略图

    在Android平台上,录制视频并生成缩略图是常见的多媒体处理功能,广泛应用于各种应用程序,如社交分享、视频编辑等。本文将深入探讨如何在Android应用中实现这一功能,包括视频录制的基本步骤、生成缩略图的方法以及...

    图片视频缩略图

    在Android平台上,获取相机拍照和录制视频后的照片及视频的缩略图,主要涉及以下几个知识点: 1. **拍照与保存图片**: - 使用`Camera`或`CameraX`库来启动相机应用并捕获图像。相机应用会返回一个`Uri`,指向新...

    录制视频生成缩略图

    在IT行业中,录制视频生成缩略图是一项常见的需求,特别是在多媒体应用、视频分享平台和社交媒体等领域。这个过程涉及到视频处理和图像操作,是数字媒体技术的重要组成部分。在Android平台上,我们可以利用内置的API...

    扫描本地视频并获取缩略图Demo

    3. **获取缩略图**:在Android中,`MediaMetadataRetriever`类可用于获取视频的帧作为缩略图。通过调用`getFrameAtTime()`方法,可以指定时间点获取一帧图像。在iOS中,`AVAssetImageGenerator`类可以做到同样的事情...

    扫描手机里的所有视频文件,生成缩略图,可以点击播放视频

    Android提供了`MediaMetadataRetriever`类来获取视频的元数据,包括缩略图。以下是如何使用该类获取视频缩略图的代码: ```java MediaMetadataRetriever retriever = new MediaMetadataRetriever(); retriever....

    android 获取视频第一帧作为缩略图的方法

    在 Android 10 及更高版本中,MediaMetadataRetriever 可以用来获取视频的第一帧作为缩略图。 使用 MediaMetadataRetriever 获取视频的第一帧作为缩略图可以通过以下步骤实现: 1. 首先,创建一个 ...

    Android应用源码实现获取视频的缩略图(ThumbnailUtils),并且播放.zip

    除了`ThumbnailUtils`,在Android中还有其他方式获取视频缩略图,例如使用`MediaMetadataRetriever`类。这个类可以获取视频的元数据,包括音频和视频流的信息,也可以通过`getFrameAtTime(long time, int option)`...

    实现获取视频的缩略图(ThumbnailUtils),并且播放_Android.rar

    在Android开发中,获取视频的缩略图以及播放视频是常见的功能需求。这些功能涉及到多媒体处理和用户界面的交互。以下将详细介绍如何实现这两个功能。 首先,获取视频的缩略图通常是为了在应用中展示视频预览,提高...

    实现获取视频的缩略图(ThumbnailUtils),并且播放.zip

    此外,Android还提供了其他获取视频缩略图的方式,如`MediaMetadataRetriever`类,它可以获取视频的元数据,包括缩略图。不过`ThumbnailUtils`通常被认为更高效,因为它可以直接从视频流中提取,而不需要解析整个...

Global site tag (gtag.js) - Google Analytics