如何获取应用专用文件的视频缩略图? 具体来说,有没有办法直接从.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
)文件在内部存储中。
答案 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();
}