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

题:

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

背景:

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

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

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

当然,您不能将MediaStore内容用于私人媒体。 如果可能的话,我会使用image processing库。 我知道OpenCV可以通过提取/调整帧大小来轻松完成。 – 请看第2页的中间部分。

你试过下面的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. } 

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

这适用于姜饼及以上:

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