Android在特定时间创建视频缩略图

qwe*_*ret 6 video time android

我已经用它来创建我的视频缩略图.代码如下所示:

videoGalleryThumbnails.add(ThumbnailUtils.extractThumbnail(ThumbnailUtils.createVideoThumbnail(
                    videoFile.getAbsolutePath(), MediaStore.Images.Thumbnails.MINI_KIND), 500, 200));
Run Code Online (Sandbox Code Playgroud)

但创建的缩略图是非常糟糕的时间.这恰好是视频是黑色的.现在我没有使用完全黑色的缩略图.

如何在特定时间拍摄视频缩略图?例如在00:31或01:44?

还是不可能?

我也尝试使用MediaMetadataRetriever,但我只得到一张白色图片.代码看起来像这样

File tempVideoList[] = (Environment.getExternalStoragePublicDirectory(PATH_VIDEO_GALLERY))
            .listFiles();
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
Bitmap myBitmap=null;
for (File videoFile : tempVideoList) {
    if (videoFile.isFile()) {
        //from here
        try {
            retriever.setDataSource(videoFile.getAbsolutePath());
            myBitmap = retriever.getFrameAtTime(11); //at 11th second
        } catch (Exception ex) {
            Log.i("MyDebugCode", "MediaMetadataRetriever got exception:" + ex);
        }

    videoGalleryThumbnails.add(myBitmap);
    //to here
}
Run Code Online (Sandbox Code Playgroud)

如果我用顶部的第一个代码替换标记为"从这里"到"到这里"的代码,它就可以工作.我还尝试了MediaMetadataRetriever.OPTION_CLOSEST和OPTION_CLOSEST_SYNC以及OPTION_NEXT_SYNC.

qwe*_*ret 6

好,我知道了.MediaMetadataRetriever绝对是正确的选择.问题是,它以微秒为单位计算时间,而不是以秒为单位.解决方案如下所示:

try {
        retriever.setDataSource(videoFile.getAbsolutePath());
        int timeInSeconds = 30;
        myBitmap = retriever.getFrameAtTime(timeInSeconds * 1000000,
                    MediaMetadataRetriever.OPTION_CLOSEST_SYNC); 
    } catch (Exception ex) {
        Log.i("MyDebugCode", "MediaMetadataRetriever got exception:" + ex);
    }

videoGalleryThumbnails.add(myBitmap);
Run Code Online (Sandbox Code Playgroud)

我不知道,如果确实需要OPTION_CLOSEST_SYNC,但看起来这是更好的编程方式.

感谢William Riley指出我正确的方向.