Android:如何获取应用程序私有文件的视频缩略图?

Posted

技术标签:

【中文标题】Android:如何获取应用程序私有文件的视频缩略图?【英文标题】:Android: how to get a video thumbnail of a file that's private to your application? 【发布时间】:2012-01-25 15:03:03 【问题描述】:

问题:

如何获取应用程序私有文件的视频缩略图? 具体来说,有没有办法直接从 .mpeg 文件中提取视频帧?

背景:

    我的应用程序包含一个可以录制视频的摄像头。 出于产品原因,视频文件最初是在应用程序的私有数据目录中以私有模式创建和写入的,使其对应用程序私有。这是使用:Context#openFileOutput(fileName, Context.MODE_PRIVATE) 完成的 - 典型的文件路径如下所示:/data/data/[package.name]/files/[fileName].mp4 - 仅供参考,我已经尝试使用 Context.MODE_WORLD_READABLE 而不是 Context.MODE_PRIVATE,但它没有帮助。 即使视频最终可能最终存储在外部存储中(通过将文件移动到 Environment#getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)),缩略图必须在视频处于应用程序专用存储时显示。

    似乎ThumbnailUtils.createVideoThumbnail(String, int) 在将文件移动到公共目录(无论是否将其添加到 MediaStore)后对文件正常工作,但当文件在内部存储中时,它会静默失败(返回 null)。

    注意:只要视频文件在应用程序私有存储中,它就不会添加到 MediaStore(设备库上的图像/视频内容提供程序提供)。只有将视频移至外部存储设备后,我才会将其添加到 MediaStore。这是一个与产品相关的决定,我无法绕过;除非有一种方法可以将视频添加到媒体存储中而其他应用程序不可见...我想知道是否可以将应用程序私有存储中的视频添加到媒体存储中并保持应用程序私有但获得所有免费的“服务” " 由媒体存储提供,例如缩略图生成。

【问题讨论】:

以下代码运行完美:Bitmap bMap = ThumbnailUtils.createVideoThumbnail(file.getAbsolutePath(), MediaStore.Video.Thumbnails.MICRO_KIND); 谢谢@PadmaKumar,还不够好。请阅读我的问题中的第 4 点。 抱歉为时已晚,但我面临同样的问题,您进一步使用的解决方案是什么。谢谢。 我最终将视频放在公共位置,获取缩略图,然后将视频移动到我的私人位置(请参阅标记答案)。 【参考方案1】:

当然,您不能将 MediaStore 的东西用于私人媒体。如果可能的话,我会使用图像处理库。我知道OpenCV can do that easily by extracting/resizing a frame. - 请看第2页的中间部分。

【讨论】:

【参考方案2】:

大多数媒体 API 只是媒体服务器的绑定客户端,在自己的进程中运行。您可以尝试将文件设为临时公开。

【讨论】:

最终做了显而易见的事情,并在外部公开文件足够的时间来获取缩略图,然后再将其移回应用专用存储。【参考方案3】:

您是否尝试过以下 API,

MediaMetadataRetriever::getFrameAtTime(),参考android-developer-page-MediaMetadataRetriever

示例代码:

MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try 
retriever.setDataSource(filePath);
bitmap = retriever.getFrameAtTime(0, MediaMetadataRetriever.OPTION_CLOSEST);
 catch (IllegalArgumentException ex) 
// Assume this is a corrupt video file
 catch (RuntimeException ex) 
// Assume this is a corrupt video file. 

上面的代码对我有用!!但我的文件可以在公共文件夹中访问。

【讨论】:

我对这个答案寄予厚望,但不幸的是它没有奏效。 setDataSource(String) 方法产生一个 RuntimeException 声称它失败了......对不起:)【参考方案4】:

这适用于姜饼及以上:

try 
    Uri location = Uri.fromFile(context.getFileStreamPath(filePath));
    MediaMetadataRetriever media = new MediaMetadataRetriever();
    ParcelFileDescriptor parcel = ParcelFileDescriptor.open(new File(location.getPath()),ParcelFileDescriptor.MODE_READ_ONLY);
    media.setDataSource(parcel.getFileDescriptor());
    Bitmap thumb = media.getFrameAtTime(0 , MediaMetadataRetriever.OPTION_CLOSEST );
    thumbnail.setImageBitmap(thumb);
 catch (FileNotFoundException e) 
    // TODO Auto-generated catch block
    e.printStackTrace();

【讨论】:

以上是关于Android:如何获取应用程序私有文件的视频缩略图?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建从Android视频文件路径视频缩略图

Android必知必会-获取视频文件的截图缩略图

如何统一创建缩略图

Android:如何获取匹配缩略图 URI 的文件路径?

Android获取(网络和本地)视频缩略图

Android - 从服务器检索视频的缩略图并显示在手机上