获取Android手机上的图片和视频缩略图及抓图!!!

a. BufferedInputStream ?       byte[] buffer = new byte[1024];
b.

Android 带缓冲的播放器

http://www.eoeandroid.com.sixxs.org/thread-79148-1-1.html


http://blog.csdn.net/chenjie19891104/article/details/6338202

http://blog.csdn.net/chenjie19891104/article/details/6331442

http://blog.csdn.net/kickxxx/article/details/6977891

http://stackoverflow.com.sixxs.org/questions/5343730/mediaplayer-stutters-at-start-of-mp3-playback/5432091#5432091

http://blog.csdn.net/faithsws/article/details/6668696

http://edu.3gmgc.com/bbs/forum.php?mod=viewthread&tid=13308&highlight=mediaplayer



http://www.eoeandroid.com.sixxs.org/thread-66935-1-1.html


写在前面的话:

研究ThumbnailUtilscreatVideoThumbnail方法发现,其实取任意时间点截图的功能已经实现,只要延伸一个接口出来就ok了。
可以重载ThumbnailUtils里面的creatVideoThumbnail方法,添加一个参数表示需要截取的视频图片的时间点,基本上是跟踪原有的creatVideoThumbnail方法就可以修改了。

如何重载?
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        try {
            retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY);
            retriever.setDataSource(filePath);
            bitmap = retriever.captureFrame();
          }
MediaMetadataRetriever是一个未公开的接口      现在急用,还请大虾明示...:Q

需要到Framework里面去修改扩展,你只需要顺着ThumbnailUtils的creatVideoThumbnail方法反向跟踪一下,就能找到设置时间点的地方。源代码是根据一个算法来计算这个时间点,我想他原本的目的是不想截图截下来的是一个“黑板”或类似功能。

能讲清楚点,计算时间点的算法在哪里,给个文件路径
/trunk/frameworks/base/include/media/IMediaMetadataRetriever.h
/trunk/frameworks/base/include/media/MediaMetadataRetrieverInterface.h
/trunk/frameworks/base/include/media/mediametadataretriever.h
/trunk/frameworks/base/media/java/android/media/MediaMetadataRetriever.java
/trunk/frameworks/base/media/java/android/media/ThumbnailUtils.java
/trunk/frameworks/base/media/jni/android_media_MediaMetadataRetriever.cpp
/trunk/frameworks/base/media/libmedia/IMediaMetadataRetriever.cpp
/trunk/frameworks/base/media/libmedia/mediametadataretriever.cpp
/trunk/frameworks/base/media/libmediaplayerservice/MetadataRetrieverClient.cpp
/trunk/frameworks/base/media/libmediaplayerservice/MetadataRetrieverClient.h
/trunk/frameworks/base/media/libstagefright/StagefrightMetadataRetriever.cpp
/trunk/frameworks/base/media/libstagefright/include/StagefrightMetadataRetriever.h

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

大家都知道Android从1.5开始刚插入SD卡时系统会调用MediaScanner服务进行后台扫描,索引新的歌曲、图片和视频等信息,如果我们需要快速提取图片和视频缩略图可以直接访问 android.provider.MediaStore.Images.Thumbnails 和android.provider.MediaStore.Video.Thumbnails这两个数据库,即可查询出来缩略图
  如何判断文件呢? 可以通过Cursor遍历数据库,对比INTERNAL_CONTENT_URI字段的值,这是一个Uri我们可以转成String,这里保存着Android手机SD卡上的多媒体文件完整路径,

  有关具体的缩略图可以通过getThumbnail(ContentResolver cr, long origId, int kind, BitmapFactory.Options options) 或getThumbnail(ContentResolver cr, long origId, long groupId, int kind, BitmapFactory.Options options) 方法获取,这两种方法返回Bitmap类型,而缩略图的分辨率可以从HEIGHT和WIDTH两个字段提取,在Android上缩略图分为两种,通过读取KIND字段来获得,分别为MICRO_KIND和MINI_KIND 分别为微型和迷你两种缩略模式,前者的分辨率更低。这样我们平时获取文件系统的某个图片预览时,可以直接调用系统缩略图,而不用自己重新计算。

  最后Android123提示大家,缩略图保存在SD卡的DCIM目录,里面的.thumbnails是图片的,而.video_thumbnails是视频的,这两个文件夹为隐藏属性,一般的文件管理器都可以看到。adb shell      ls -l

从Android2.2开始系统新增了一个缩略图ThumbnailUtils类,位于framework的android.media.ThumbnailUtils位置,可以帮助我们从mediaprovider中获取系统中的视频或图片文件的缩略图,该类提供了三种静态方法可以直接调用获取。

1. static Bitmap createVideoThumbnail(String filePath, int kind)   //获取视频文件的缩略图,第一个参数为视频文件的位置,比如/sdcard/android123.3gp,而第二个参数可以为MINI_KIND或MICRO_KIND最终和分辨率有关

2. static Bitmap extractThumbnail(Bitmap source, int width, int height, int options) //直接对Bitmap进行缩略操作,最后一个参数定义为OPTIONS_RECYCLE_INPUT,来回收资源

3. static Bitmap extractThumbnail(Bitmap source, int width, int height) // 这个和上面的方法一样,无options选项

最后Android开发网再次提醒大家,ThumbnailUtils类是API Level从8或更高才开始支持的。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

http://www.linuxidc.com/Linux/2011-08/40109p2.htm

  1.  /** 
  2.      * Create a video thumbnail for a video. May return null if the video is 
  3.      * corrupt or the format is not supported. 
  4.      * 
  5.      * @param filePath the path of video file 
  6.      * @param kind could be MINI_KIND or MICRO_KIND 
  7.      */  
  8.     public static Bitmap createVideoThumbnail(String filePath, int kind) {  
  9.         Bitmap bitmap = null;  
  10.         MediaMetadataRetriever retriever = new MediaMetadataRetriever();  
  11.         try {  
  12.             retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY);  
  13.             retriever.setDataSource(filePath);  
  14.             bitmap = retriever.captureFrame();  
  15.         } catch (IllegalArgumentException ex) {  
  16.             // Assume this is a corrupt video file  
  17.         } catch (RuntimeException ex) {  
  18.             // Assume this is a corrupt video file.  
  19.         } finally {  
  20.             try {  
  21.                 retriever.release();  
  22.             } catch (RuntimeException ex) {  
  23.                 // Ignore failures while cleaning up.  
  24.             }  
  25.         }  
  26.         if (kind == Images.Thumbnails.MICRO_KIND && bitmap != null) {  
  27.             bitmap = extractThumbnail(bitmap,  
  28.                     TARGET_SIZE_MICRO_THUMBNAIL,  
  29.                     TARGET_SIZE_MICRO_THUMBNAIL,  
  30.                     OPTIONS_RECYCLE_INPUT);  
  31.         }  
  32.         return bitmap;  
  33.     } 
++++++++++++++++++++++++++++++++++

为多媒体文件生成缩略图

1、Video
对于视频,取第一帧作为缩略图,也就是怎样从filePath得到一个Bitmap对象。
Java代码   收藏代码
  1. private Bitmap createVideoThumbnail(String filePath) {   
  2.         Bitmap bitmap = null;   
  3.         MediaMetadataRetriever retriever = new MediaMetadataRetriever();   
  4.         try {   
  5.             retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY);   
  6.             retriever.setDataSource(filePath);   
  7.             bitmap = retriever.captureFrame();   
  8.         } catch(IllegalArgumentException ex) {   
  9.             // Assume this is a corrupt video file   
  10.         } catch (RuntimeException ex) {   
  11.             // Assume this is a corrupt video file.   
  12.         } finally {   
  13.             try {   
  14.                 retriever.release();   
  15.             } catch (RuntimeException ex) {   
  16.                 // Ignore failures while cleaning up.   
  17.             }   
  18.         }   
  19.         return bitmap;   
  20.     }   

Android提供了MediaMetadataRetriever,由JNI(media_jni)实现。
看得出MediaMetadataRetriever主要有两个功能:MODE_GET_METADATA_ONLY和MODE_CAPTURE_FRAME_ONLY
这里设mode为MODE_CAPTURE_FRAME_ONLY,调用captureFrame取得一帧。
另外还有两个方法可以用:
extractMetadata 提取文件信息,ARTIST、DATE、YEAR、DURATION、RATING、FRAME_RATE、VIDEO_FORMAT
和extractAlbumArt 提取专辑信息,这个下面的音乐文件可以用到。


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值