Mi piacerebbe leggere un file Mp4 in java8-64bit fotogramma per fotogramma e scrivere ogni fotogramma come jpg sul mio disco rigido. il mio primo tentativo è stato quello di utilizzare il lettore multimediale JavaFX 2.2 per riprodurre il file su un componente View. Ho pensato che forse ci sarebbe stata un'opzione per registrare un osservatore per ottenere un evento ogni volta che un nuovo frame è stato caricato e pronto per essere dipinto sulla superficie del componente, ma sembra che non ci sia un tale metodo. sarebbe sufficiente prendere solo quei frame/pixel che sono stati dipinti sul componente.Come leggere un video fotogramma per fotogramma?
È possibile farlo utilizzando il lettore multimediale? il motivo per cui utilizzo il lettore multimediale è che è stata la soluzione più semplice a cui ho lavorato. Ho provato vlcj, solo a 32 bit, e gstreamer ma senza fortuna :(
quello che ho ottenuto finora:
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;
}
c'è in qualche modo un modo per effettuare le seguenti operazioni:
player.setOnNextFrameReady(final Event evt) { writeImage(evt.getFrame()) };
Grazie!
molto bello, farò un tentativo. – Chris