Glide - load single frame de la vidéo à un moment précis?
Je suis en train d'utiliser Glisser pour faire défiler les images dans un fichier vidéo (sans l'image-clé de la recherche de question que Android souffre d'). Je peux le faire en Picasso en faisant quelque chose comme:
picasso = new Picasso.Builder(MainActivity.this).addRequestHandler(new PicassoVideoFrameRequestHandler()).build();
picasso.load("videoframe://" + Environment.getExternalStorageDirectory().toString() +
"/source.mp4#" + frameNumber)
.placeholder(drawable)
.memoryPolicy(MemoryPolicy.NO_CACHE)
.into(imageView);
(frameNumber est tout simplement un int qui augmente de 50000 microsecondes à chaque fois). J'ai aussi un PicassoVideoFrameRequestHandler comme ceci:
public class PicassoVideoFrameRequestHandler extends RequestHandler {
public static final String SCHEME = "videoframe";
@Override public boolean canHandleRequest(Request data) {
return SCHEME.equals(data.uri.getScheme());
}
@Override
public Result load(Request data, int networkPolicy) throws IOException {
FFmpegMediaMetadataRetriever mediaMetadataRetriever = new FFmpegMediaMetadataRetriever();
mediaMetadataRetriever.setDataSource(data.uri.getPath());
String offsetString = data.uri.getFragment();
long offset = Long.parseLong(offsetString);
Bitmap bitmap = mediaMetadataRetriever.getFrameAtTime(offset, FFmpegMediaMetadataRetriever.OPTION_CLOSEST);
return new Result(bitmap, Picasso.LoadedFrom.DISK);
}
}
Je voudrais utiliser Glisse au lieu de cela, comme il gère la mémoire un peu mieux. Est-il possible d'avoir cette fonctionnalité Glisser?
Ou, vraiment, de toute autre manière à créer un ensemble d'images à partir d'une vidéo qui je peux étape par!
Merci!
Vous devez vous connecter pour publier un commentaire.
Vous aurez besoin de passer ".remplacer(largeur, hauteur) de" faire de Sam Judd méthode de travail. Sinon, vous obtiendrez seulement la première image de la vidéo que j'ai testé différentes approches pour heures. Espérons qu'il permet de gagner du temps pour quelqu'un.
Vous pouvez passer dans un cadre de temps (En microsecondes, voir la MediaMetadataRetriever docs) à VideoBitmapDecoder. Ce n'est pas testé, mais ça devrait fonctionner:
Log.e("glide", "loaded bitmap of size " + resource.getByteCount() + " (position " + position + ") in " + (System.currentTimeMillis() - time) + "ms");
- Les résultats ressembler à quelque chose comme ceci:06-11 12:45:15.830 19526-19526/com.example.videoconversiondemo E/glide﹕ loaded bitmap of size 1936512 (position 1000000) in 72ms 06-11 12:45:19.260 19526-19526/com.example.videoconversiondemo E/glide﹕ loaded bitmap of size 1936512 (position 2000000) in 2ms 06-11 12:45:22.450 19526-19526/com.example.videoconversiondemo E/glide﹕ loaded bitmap of size 1936512 (position 3000000) in 1ms
- Des idées? Merci à tous pour votre aide! (J'ai essayé de désactiver la mise en cache de la mémoire, mais il reste juste les retours de la première image)Merci, ce Post m'aider à y arriver. Btw, si vous êtes à l'aide de Glisse 4.4 ils changer la façon dont vous obtenez ce résultat. Pour charger une image à partir d'une vidéo uri.
Vous avez juste besoin d'utiliser l'objet RequestOptions comme ceci:
Où "positionInMillis" de son une variable de type long de la vidéo de la position que vous voulez que l'image.