xuggler
Modify video file with Xuggler example
With this example we shall show you how to modify video file using Xuggler in a Java Desktop Application.So, let’s suppose we wish to add a static image to our video and at the same time we wish to reduce the audio volume.
Here are the basic steps you need to take:
- Create a
IMediaReaderto read the video file. - Configure it to generate BufferImages using
mediaReader.setBufferedImageTypeToGenerate. - Create an
IMediaWriterusingToolFactory.makeWriter. - Create a new IMediaTool calling
StaticImageMediaTool(imageFilename). - Create a new IMediaTool for the audio using
new VolumeAdjustMediaTool(0.1). - Create a tool chain: reader -> addStaticImage -> reduceVolume -> writer.
- Create a class tha extends
MediaToolAdapter. - Override
onVideoPicturemethod. This will help you insert the image in the position you want.
Let’s see the code that implements all the above:
package com.javacodegeeks.xuggler;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.ShortBuffer;
import javax.imageio.ImageIO;
import com.xuggle.mediatool.IMediaReader;
import com.xuggle.mediatool.IMediaTool;
import com.xuggle.mediatool.IMediaWriter;
import com.xuggle.mediatool.MediaToolAdapter;
import com.xuggle.mediatool.ToolFactory;
import com.xuggle.mediatool.event.IAudioSamplesEvent;
import com.xuggle.mediatool.event.IVideoPictureEvent;
public class ModifyMediaExample {
private static final String inputFilename = "c:/myvideo.mp4";
private static final String outputFilename = "c:/myvideo.flv";
private static final String imageFilename = "c:/jcg_logo_small.png";
public static void main(String[] args) {
// create a media reader
IMediaReader mediaReader = ToolFactory.makeReader(inputFilename);
// configure it to generate BufferImages
mediaReader.setBufferedImageTypeToGenerate(BufferedImage.TYPE_3BYTE_BGR);
IMediaWriter mediaWriter =
ToolFactory.makeWriter(outputFilename, mediaReader);
IMediaTool imageMediaTool = new StaticImageMediaTool(imageFilename);
IMediaTool audioVolumeMediaTool = new VolumeAdjustMediaTool(0.1);
// create a tool chain:
// reader -> addStaticImage -> reduceVolume -> writer
mediaReader.addListener(imageMediaTool);
imageMediaTool.addListener(audioVolumeMediaTool);
audioVolumeMediaTool.addListener(mediaWriter);
while (mediaReader.readPacket() == null) ;
}
private static class StaticImageMediaTool extends MediaToolAdapter {
private BufferedImage logoImage;
public StaticImageMediaTool(String imageFile) {
try {
logoImage = ImageIO.read(new File(imageFile));
}
catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Could not open file");
}
}
@Override
public void onVideoPicture(IVideoPictureEvent event) {
BufferedImage image = event.getImage();
// get the graphics for the image
Graphics2D g = image.createGraphics();
Rectangle2D bounds = new
Rectangle2D.Float(0, 0, logoImage.getWidth(), logoImage.getHeight());
// compute the amount to inset the time stamp and
// translate the image to that position
double inset = bounds.getHeight();
g.translate(inset, event.getImage().getHeight() - inset);
g.setColor(Color.WHITE);
g.fill(bounds);
g.setColor(Color.BLACK);
g.drawImage(logoImage, 0, 0, null);
// call parent which will pass the video onto next tool in chain
super.onVideoPicture(event);
}
}
private static class VolumeAdjustMediaTool extends MediaToolAdapter {
// the amount to adjust the volume by
private double mVolume;
public VolumeAdjustMediaTool(double volume) {
mVolume = volume;
}
@Override
public void onAudioSamples(IAudioSamplesEvent event) {
// get the raw audio bytes and adjust it's value
ShortBuffer buffer =
event.getAudioSamples().getByteBuffer().asShortBuffer();
for (int i = 0; i < buffer.limit(); ++i) {
buffer.put(i, (short) (buffer.get(i) * mVolume));
}
// call parent which will pass the audio onto next tool in chain
super.onAudioSamples(event);
}
}
}This was an example on how to modify video file with Xuggler.
Related Article:

