package org.korsakow.domain.command; import java.io.File; import org.dsrg.soenea.domain.command.CommandException; import org.korsakow.ide.exception.MediaRuntimeException; import org.korsakow.ide.resources.media.MediaInfo; import org.korsakow.ide.resources.media.MediaInfoFactory; import org.korsakow.ide.util.FileUtil; import org.korsakow.services.encoders.EncoderException; import org.korsakow.services.encoders.UnsupportedFormatException; import org.korsakow.services.encoders.video.AudioCodec; import org.korsakow.services.encoders.video.ContainerFormat; import org.korsakow.services.encoders.video.VideoCodec; import org.korsakow.services.encoders.video.VideoEncoder; import org.korsakow.services.encoders.video.VideoEncoderException; import org.korsakow.services.encoders.video.VideoEncoderFactory; public class CreateThumbnailCommand extends AbstractCommand { public static final String VIDEO_FILE = "videofile"; public static final String THUMBNAIL_FILE = "thumbnailfile"; public static final String OFFSET_MILLIS = "offsetmillis"; public static final String RANDOM_OFFSET = "randomoffset"; public CreateThumbnailCommand(Helper request, Helper response) { super(request, response); } public void execute() throws CommandException { String videoFilename = request.getString(VIDEO_FILE); File videoFile = new File(videoFilename); String thumbnailFilename = request.getString(THUMBNAIL_FILE); File thumbnailFile = new File(thumbnailFilename); Long offset = request.getLong(OFFSET_MILLIS); if (request.get(RANDOM_OFFSET) != null && request.getBoolean(RANDOM_OFFSET)) { MediaInfo info; try { info = MediaInfoFactory.getInfo(thumbnailFile); } catch (MediaRuntimeException e) { throw new CommandException(e); } offset = (long)(info.duration * Math.random()); } try { thumbnailFile = createThumbnail(videoFile, thumbnailFile, offset); } catch (UnsupportedFormatException e) { throw new CommandException(e); } catch (EncoderException e) { throw new CommandException(e); } catch (InterruptedException e) { throw new CommandException(e); } response.set(CreateThumbnailCommand.THUMBNAIL_FILE, thumbnailFile.getAbsolutePath()); } /** * @return thumbnailFile with its file extension possibly modified * @throws InterruptedException * @throws EncoderException * @throws VideoEncoderException */ private File createThumbnail(File videoFile, File thumbnailFile, Long offset) throws InterruptedException, EncoderException { VideoEncoderFactory factory = VideoEncoderFactory.getNewFactory(); factory.addRequiredInputFormat(VideoCodec.JPG); VideoEncoder encoder = factory.createVideoEncoder(); encoder.setContainerFormat(ContainerFormat.JPG); encoder.setVideoCodec(VideoCodec.JPG); encoder.setAudioCodec(AudioCodec.NONE); encoder.setFrameCount(1L); if (offset != null) encoder.setOffset(offset); thumbnailFile = new File(FileUtil.setFileExtension(thumbnailFile.getAbsolutePath(), encoder.getFileExtension(ContainerFormat.JPG))); encoder.encode(VideoCodec.JPG, videoFile, thumbnailFile); return thumbnailFile; } }