Comment lire une vidéo image par image?
je voudrais lire un fichier Mp4 dans java8-64bit image par image et écrire chaque image comme un fichier jpg de mon disque dur. ma première tentative a été d'utiliser JavaFX 2.2 media player pour lire le fichier
sur une Vue de composant. j'ai pensé que peut-être il y aurait une possibilité de s'inscrire en qualité d'observateur à obtenir un événement chaque fois qu'une nouvelle image a été chargée et prête à être peinte sur la surface du composant mais il semble qu'il n'y a pas une telle méthode.
il suffirait de prendre juste les images/les pixels qui l'a peint sur le composant.
Cela peut être fait en utilisant le lecteur multimédia? la raison pour laquelle j'utilise le lecteur multimédia est bcs c'était la solution la plus simple je suis workin. j'ai essayé vlcj, à seulement 32 bits, et gstreamer, mais sans succès 🙁
ce que j'ai obtenu jusqu'à présent:
public class VideoGrabber extends extends JFrame {
//code for scene setup omitted
final MediaView view = createMediaView(...)
//some other stuff happens here
//now start the video
view.getMediaPlayer().seek(Duration.ZERO);
view.getMediaPlayer().play();
view.getMediaPlayer().setOnEndOfMedia(new Runnable()
{ //save image when done
BufferedImage img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_BGR
view.paint(img.getGraphics());
ImageIO.write(img, "JPEG", new File("pic-"+System.currentTimeMillis()+".jpg"));
});
//somewhere else to create
private MediaView createMediaView(String url)
{
final Media clip = new Media(url);
final MediaPlayer player = new MediaPlayer(clip);
final MediaView view = new MediaView(player);
view.setFitWidth(VID_WIDTH);
view.setFitHeight(VID_HEIGHT);
return view;
}
est-il en quelque sorte une façon de faire les choses suivantes:
player.setOnNextFrameReady(final Event evt) { writeImage(evt.getFrame()) };
Merci!
Vous devez vous connecter pour publier un commentaire.
Marvin Cadre fournit des méthodes pour traiter des fichiers multimédia, image par image. Ci-dessous, il est montré qu'un traitement vidéo simple exemple qui met en évidence la trajectoire d'une boule.
À la gauche de la lecture de la vidéo image par image, avec un intervalle de 30ms entre les images. À la droite de la vidéo image par image, mais en gardant toutes les positions de la balle blanche par le biais d'un traitement d'image simple approche.
Le code source peut être vérifié ici et la vidéo ici.
Ci-dessous l'essentiel du code source à la demande des médias de fichier des images à l'aide de Marvin:
Vous pouvez utiliser la capture d'écran() de MediaView.
D'abord connecter un lecteur multimédia à un MediaView composant, puis utiliser mediaPlayer.seek() pour rechercher la position vidéo. Et puis vous pouvez utiliser le code suivant pour extraire le cadre de l'image:
Cadres comme ffmpeg viennent avec des outils de ligne de commande pour diviser une vidéo en images individuelles (c'est à dire les images dans un dossier).
Voir cette question: ffmpeg split avi en images avec des taux de trame connu
Les réponses contient des liens vers Java cadres de laquelle s'enroulent ffmpeg.
https://code.google.com/p/jjmpeg/
. Je ne recommande pas d'utiliser la ligne de commande pour extraire image par image dans un tuyau depuis la recherche, dans le flux vidéo sera trop cher.