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
)。
【问题讨论】:
以下代码运行完美: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:如何获取应用程序私有文件的视频缩略图?的主要内容,如果未能解决你的问题,请参考以下文章