注意:这是我们的“ Xuggler开发教程 ”系列的一部分。
到目前为止,在我们的Xuggler教程系列中,我们已经对视频处理的Xuggler进行了介绍,并讨论了转码和媒体修改 。 在本教程中,我们将看到如何解码视频和捕获帧,以及如何从头开始创建视频。
让我们开始解码视频流并以预定义的时间间隔捕获一些帧。 例如,可以使用它来制作媒体文件的缩略图 。 为此,我们将再次使用MediaTool API ,这是用于解码,编码和修改视频的高级API。
概念是打开媒体文件,循环播放特定的视频流,并以特定的间隔捕获相应的帧,将其转换为图像,然后将二进制内容转储到文件中。 这是所有这些代码的样子:
package com.javacodegeeks.xuggler;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
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 VideoThumbnailsExample {
public static final double SECONDS_BETWEEN_FRAMES = 10;
private static final String inputFilename = "c:/Java_is_Everywhere.mp4";
private static final String outputFilePrefix = "c:/snapshots/mysnapshot";
// The video stream index, used to ensure we display frames from one and
// only one video stream from the media container.
private static int mVideoStreamIndex = -1;
// Time of last frame write
private static long mLastPtsWrite = Global.NO_PTS;
public static final long MICRO_SECONDS_BETWEEN_FRAMES =
(long)(Global.DEFAULT_PTS_PER_SECOND * SECONDS_BETWEEN_FRAMES);
public static void main(String[] args) {
IMediaReader mediaReader = ToolFactory.makeReader(inputFilename);
// stipulate that we want BufferedImages created in BGR 24bit color space
mediaReader.setBufferedImageTypeToGenerate(BufferedImage.TYPE_3BYTE_BGR);
mediaReader.addListener(new ImageSnapListener());
// read out the contents of the media file and
// dispatch events to the attached listener
while (mediaReader.readPacket() == null) ;
}
private static class ImageSnapListener extends MediaListenerAdapter {
public void onVideoPicture(IVideoPictureEvent event) {
if (event.getStreamIndex() != mVideoStreamIndex) {
// if the selected video stream id is not yet set, go ahead a