gpt4 book ai didi

java - 使用 xuggler 获取视频的一个屏幕截图/快照的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-30 09:20:00 25 4
gpt4 key购买 nike

我想使用 xuggler 从视频创建图像。提供的示例代码每隔一段时间从视频中生成图像,我对其进行了修改,使其仅从视频中生成一张图像。但是,看起来它实际上是在循环播放整个视频,而不是只是拍摄特定时间的快照然后结束。

如何在不循环播放整个视频的情况下从视频中正确生成一个图像?对于较短的视频,这很好,但对于 hr+ 视频,这将成为一个大问题。

下面是我的代码:

import javax.imageio.ImageIO;

import java.io.File;

import java.awt.image.BufferedImage;
import java.util.Random;

import com.xuggle.mediatool.IMediaReader;
import com.xuggle.mediatool.MediaListenerAdapter;
import com.xuggle.mediatool.ToolFactory;
import com.xuggle.mediatool.event.IVideoPictureEvent;
import com.xuggle.xuggler.Global;

public class Test extends MediaListenerAdapter {
public static final double SECONDS_BETWEEN_FRAMES = 1;
public static final long MICRO_SECONDS_BETWEEN_FRAMES = (long)(Global.DEFAULT_PTS_PER_SECOND * SECONDS_BETWEEN_FRAMES);

private int mVideoStreamIndex = -1;
boolean takeImage = true;

public static void main(String[] args) {
new Test("src/main/Wildlife_ 512kb, hkf.mp4");
}

public Test(String filename) {
System.out.println("starting the xuggler");
IMediaReader reader = ToolFactory.makeReader(filename);
reader.setBufferedImageTypeToGenerate(BufferedImage.TYPE_3BYTE_BGR);
reader.addListener(this);
while (reader.readPacket() == null) { do { } while(false); }
}

public void onVideoPicture(IVideoPictureEvent event) {
try {
if (event.getStreamIndex() != mVideoStreamIndex) {
if (-1 == mVideoStreamIndex) {
mVideoStreamIndex = event.getStreamIndex();
} else {
return;
}
}

if (event.getTimeStamp() > MICRO_SECONDS_BETWEEN_FRAMES && takeImage) {
Random random = new Random();
File file = new File("/Users/yao/__TEMP__/media_upload_temp/" + random.nextInt(Integer.MAX_VALUE) + ".png");
ImageIO.write(event.getImage(), "png", file);

double seconds = ((double)event.getTimeStamp()) / Global.DEFAULT_PTS_PER_SECOND;
System.out.printf("at elapsed time of %6.3f seconds wrote: %s\n", seconds, file);

takeImage = false;
}
} catch (Exception e) { e.printStackTrace(); }
}
}

最佳答案

基本上,我只是添加了一个 boolean 字段,并使用它来管理在捕获一张图像后何时跳出循环/视频。

 while (reader.readPacket() == null) {
if (!takeImage) {
reader.removeListener(this);
break;
}
}

关于java - 使用 xuggler 获取视频的一个屏幕截图/快照的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17660490/

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