import java.awt.Transparency;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ComponentColorModel;
import java.awt.image.ComponentSampleModel;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import uk.co.caprica.vlcj.player.MediaPlayerFactory;
import uk.co.caprica.vlcj.player.direct.BufferFormat;
import uk.co.caprica.vlcj.player.direct.BufferFormatCallback;
import uk.co.caprica.vlcj.player.direct.DirectMediaPlayer;
import uk.co.caprica.vlcj.player.direct.RenderCallback;
import uk.co.caprica.vlcj.player.direct.format.RV32BufferFormat;
import com.sun.jna.Memory;
public class VlcjDirectTest {
private static class DirectBufferFormatCallback implements BufferFormatCallback {
@Override
public BufferFormat getBufferFormat(int sourceWidth, int sourceHeight) {
return new RV32BufferFormat(sourceWidth, sourceHeight);
}
}
private final static String[] VLC_ARGS = {
"--intf", "dummy",
"--vout", "dummy",
"--no-audio",
"--no-video-title-show",
"--no-stats",
"--no-sub-autodetect-file",
"--no-snapshot-preview",
"--live-caching=50",
"--quiet",
};
private static BufferedImage convert(Memory[] buffers, BufferFormat format) {
if (buffers.length == 0) {
throw new RuntimeException("No memory elements found!");
}
final Memory memory = buffers[0];
if (memory == null) {
throw new RuntimeException("Null memory!");
}
final int width = format.getWidth();
final int height = format.getHeight();
final int dataType = DataBuffer.TYPE_BYTE;
final int pixelStride = 4;
final int scanlineStride = width * pixelStride;
final int[] bgrBandOffsets = new int[] { 2, 1, 0 };
final int[] bits = { 8, 8, 8 };
final int[] offsets = new int[] { 0 };
final int transparency = Transparency.OPAQUE;
final byte[] bytes = new byte[scanlineStride * height];
final byte[][] data = new byte[][] { bytes };
memory
.getByteBuffer(0, memory.size())
.get(bytes);
ColorSpace colorSpace = ColorSpace.getInstance(ColorSpace.CS_sRGB);
ComponentSampleModel sampleModel = new ComponentSampleModel(dataType, width, height, pixelStride, scanlineStride, bgrBandOffsets);
ComponentColorModel colorModel = new ComponentColorModel(colorSpace, bits, false, false, transparency, dataType);
DataBufferByte dataBuffer = new DataBufferByte(data, bytes.length, offsets);
WritableRaster raster = Raster.createWritableRaster(sampleModel, dataBuffer, null);
BufferedImage image = new BufferedImage(colorModel, raster, false, null);
image.flush();
return image;
}
private static MediaPlayerFactory factory = new MediaPlayerFactory(VLC_ARGS);
private static DirectMediaPlayer player;
public static void main(String[] args) throws IOException, InterruptedException {
player = factory.newDirectMediaPlayer(
new DirectBufferFormatCallback(),
new RenderCallback() {
int i = 0;
@Override
public void display(DirectMediaPlayer player, Memory[] buffers, BufferFormat format) {
if (i++ < 10) {
BufferedImage bi = convert(buffers, format);
try {
ImageIO.write(bi, "JPG", new File(System.currentTimeMillis() + "-test.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("write " + i);
}
}
});
String device = "/dev/video0";
String mrl = "v4l2://" + device;
String[] options = new String[] {
":v4l2-vdev=" + device,
":v4l2-width=320",
":v4l2-height=240",
":v4l2-fps=30",
":v4l2-adev=none",
};
player.startMedia(mrl, options);
Thread.sleep(1000);
player.stop();
player.release();
factory.release();
}
}