gpt4 book ai didi

java - 如何逐帧读取视频?

转载 作者:搜寻专家 更新时间:2023-10-31 08:19:41 25 4
gpt4 key购买 nike

我想逐帧读取 java8-64 位的 Mp4 文件,并将每一帧作为 jpg 格式写入我的硬盘。我的第一次尝试是使用 JavaFX 2.2 媒体播放器来播放文件在 View 组件上。我想也许会有一个选项来注册观察者以在每次加载新框架并准备好在组件表面上绘制时获取事件,但似乎没有这样的方法。只抓取绘制在组件上的那些帧/像素就足够了。

这可以通过使用媒体播放器来完成吗?我使用媒体播放器的原因是因为它是我得到的最简单的解决方案。我尝试了 vlcj,只有 32 位,和 gstreamer 但没有运气 :(

到目前为止我得到了什么:

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;
}

是否有某种方法可以执行以下操作:

player.setOnNextFrameReady(final Event evt) { writeImage(evt.getFrame()) };

谢谢!

最佳答案

可以使用MediaView的snapshot()。首先将 mediaPlayer 连接到 MediaView 组件,然后使用 mediaPlayer.seek() 查找视频位置。然后您可以使用以下代码提取图像帧:

    int width = mediaPlayer.getMedia().getWidth();
int height = mediaPlayer.getMedia().getHeight();
WritableImage wim = new WritableImage(width, height);
MediaView mv = new MediaView();
mv.setFitWidth(width);
mv.setFitHeight(height);
mv.setMediaPlayer(mediaPlayer);
mv.snapshot(null, wim);
try {
ImageIO.write(SwingFXUtils.fromFXImage(wim, null), "png", new File("/test.png"));
} catch (Exception s) {
System.out.println(s);
}

关于java - 如何逐帧读取视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24552486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com