Added frame grabber

This commit is contained in:
Ziver Koc 2012-10-31 19:34:46 +00:00
parent b6adc5c402
commit 06861e1658
2 changed files with 171 additions and 104 deletions

View file

@ -1,12 +1,14 @@
package zall;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServlet;
@ -25,6 +27,8 @@ import com.xuggle.xuggler.ICodec;
import com.xuggle.xuggler.IStreamCoder;
import com.xuggle.xuggler.IVideoPicture;
import com.xuggle.xuggler.IVideoResampler;
import com.xuggle.xuggler.video.ConverterFactory;
import com.xuggle.xuggler.video.IConverter;
import zall.bean.Media.Size;
import zall.bean.Video;
@ -127,7 +131,7 @@ public class ZalleryTranscoder extends HttpServlet{
///////////// Start Transcoding
// create a media reader
IMediaReader reader = ToolFactory.makeReader( originalFile.getPath() );
reader.addListener(new FrameGrabListener(reader, 0.2));
reader.addListener(new FrameGrabListener(reader, smallFile, 0.2));
reader.addListener(new ProgressListener(reader));
VideoTranscoderListener converter = new VideoTranscoderListener(640, 360);
@ -221,28 +225,22 @@ class VideoTranscoderListener extends MediaToolAdapter{
private IVideoResampler videoResampler = null;
private IAudioResampler audioResampler = null;
IMediaWriter writer;
@Override
public void onAddStream(IAddStreamEvent event) {
int streamIndex = event.getStreamIndex();
IStreamCoder streamCoder = event.getSource().getContainer().getStream(streamIndex).getStreamCoder();
if (streamCoder.getCodecType() == ICodec.Type.CODEC_TYPE_AUDIO) {
//writer.addAudioStream(streamIndex, streamIndex, ICodec.ID.CODEC_ID_AAC, 2, 44100);
streamCoder.setSampleRate( 44100 );
/*
streamCoder.setCodec( ICodec.ID.CODEC_ID_AAC );
streamCoder.setBitRate( 128 );
*/
//streamCoder.setCodec( ICodec.ID.CODEC_ID_AAC );
//streamCoder.setBitRate( 128 );
}
else if (streamCoder.getCodecType() == ICodec.Type.CODEC_TYPE_VIDEO) {
//writer.addVideoStream(streamIndex, streamIndex, ICodec.ID.CODEC_ID_H264, VIDEO_WIDTH, VIDEO_HEIGHT);
streamCoder.setWidth( width );
streamCoder.setHeight( height );
/*
streamCoder.setCodec(ICodec.findEncodingCodec( ICodec.ID.CODEC_ID_H264 ));
streamCoder.setBitRate( 500000 );
//streamCoder.setCodec(ICodec.findEncodingCodec( ICodec.ID.CODEC_ID_H264 ));
//streamCoder.setBitRate( 800000 );
/*
int retval = Configuration.configure("/usr/local/xuggler/share/ffmpeg/libx264-superfast.ffpreset", streamCoder);
if (retval<0)
throw new RuntimeException("cound not cofigure coder from preset file");
@ -323,21 +321,38 @@ class ProgressListener extends MediaToolAdapter {
class FrameGrabListener extends MediaToolAdapter {
private long totalLength;
private long grabAt;
private File outputFile;
public FrameGrabListener(IMediaReader reader, double at) {
public FrameGrabListener(IMediaReader reader, File outputFile, double at) {
if( !reader.isOpen() )
reader.open(); // read container
this.totalLength = reader.getContainer().getDuration();
this.outputFile = outputFile;
setAtProgress(at);
}
@Override
public void onVideoPicture(IVideoPictureEvent event) {
long currentLength = event.getTimeStamp();
if( grabAt > 0 && currentLength > grabAt ){
System.out.println("\nScreanshoot!!!");
grabAt = -1;
try{
long currentLength = event.getTimeStamp();
if( grabAt > 0 && currentLength > grabAt ){
System.out.println("\nScreanshoot!!!");
ConverterFactory.Type mConverterType = ConverterFactory.findRegisteredConverter(
ConverterFactory.XUGGLER_BGR_24);
IConverter mVideoConverter = ConverterFactory.createConverter(
mConverterType.getDescriptor(),
event.getPicture());
ImageIO.write(
mVideoConverter.toImage(event.getPicture()),
"png",
outputFile);
grabAt = -1;
}
}catch(IOException e){
e.printStackTrace();
}
}
@ -346,3 +361,4 @@ class FrameGrabListener extends MediaToolAdapter {
}
}