参考 :
使用xuggler获取视频的截图/快照的正确方法是什么? - VoidCC
xuggle工具获取jar包_xuggle-xuggler-5.2.jar下载_阳逗逗的博客-CSDN博客
maven仓库地址 : https://mvnrepository.com/artifact/xuggle/xuggle-xuggler/5.4
maven坐标
<!-- https://mvnrepository.com/artifact/xuggle/xuggle-xuggler -->
<dependency>
<groupId>xuggle</groupId>
<artifactId>xuggle-xuggler</artifactId>
<version>5.4</version>
</dependency>
jar下载 https://www.dcm4che.org/maven2/xuggle/xuggle-xuggler/5.4/xuggle-xuggler-5.4.jar
maven导入本地
<dependency>
<groupId>xuggle</groupId>
<artifactId>xuggle-xuggler</artifactId>
<version>5.4</version>
<scope>system</scope>
<systemPath>${basedir}/lib/xuggle-xuggler-5.4.jar</systemPath>
</dependency>
处理逻辑
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;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
@Data
@NoArgsConstructor
public class ScreenshotUtil 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;
private Boolean takeImage = true;
// 截图文件存放地址 .png
private String filePath;
// 视频流地址
private String videoUrl;
public ScreenshotUtil(String filePath, String videoUrl) {
this.filePath = filePath;
this.videoUrl = videoUrl;
}
public static void main(String[] args) {
new ScreenshotUtil("F:\\work\\test\\t2\\222.png", "http://xxxxx.flv").handle();
}
public void handle() {
IMediaReader reader = ToolFactory.makeReader(this.videoUrl);
reader.setBufferedImageTypeToGenerate(BufferedImage.TYPE_3BYTE_BGR);
reader.addListener(this);
while (reader.readPacket() == null) {
do {
if (!this.takeImage) {
return;
}
} while (false);
}
reader.close();
}
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) {
File file = new File(this.getFilePath());
ImageIO.write(event.getImage(), "png", file);
takeImage = false;
//}
} catch (Exception e) {
e.printStackTrace();
}
}
}