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

时间:2011-12-21 20:29:57

标签: android video media thumbnails mediastore

问题:

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

背景:

  1. 我的应用程序包含一个可以录制视频的摄像头。
  2. 出于产品原因,视频文件最初是在应用程序的私有数据目录中以私有模式创建和写入的,使其对应用程序是私有的。这是使用以下完成的:Context#openFileOutput(fileName, Context.MODE_PRIVATE) - 典型的文件路径如下所示:/data/data/[package.name]/files/[fileName].mp4 - 仅供参考我已经尝试使用Context.MODE_WORLD_READABLE代替Context.MODE_PRIVATE,但它没有帮助。
  3. 即使视频最终可能会进入外部存储空间(通过将文件移至Environment#getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)),但在视频处于应用程序专用存储空间时,必须显示缩略图
  4. 似乎ThumbnailUtils.createVideoThumbnail(String, int)在将文件移动到公共目录后(无论是将其添加到MediaStore中)都能正常工作,但是当它静默失败时(返回null)文件在内部存储中。

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

您是否尝试过以下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. }

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

答案 3 :(得分:0)

这适用于Gingerbread及以上:

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();
}