Di post sebelum ini kita sudah membahas bagaimana memainkan multimedia dari local disk. Sekarang kita akan membahas bagaimana caranya untuk capture video dan audio dari web cam dan microphone dan menampilkannya di aplikasi kita.
Pertama, kita buat class untuk menangani format dari video dan audio kita.
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import javax.media.*;
import javax.media.format.*;
import javax.media.protocol.DataSource;
import javax.swing.*;
public class CaptureDeviceDialog extends Dialog implements ActionListener, ItemListener {
boolean configurationChanged = false;
Vector devices;
Vector audioDevices;
Vector videoDevices;
Vector audioFormats;
Vector videoFormats;
Choice audioDeviceCombo;
Choice videoDeviceCombo;
Choice audioFormatCombo;
Choice videoFormatCombo;
public CaptureDeviceDialog(Frame parent, String title, boolean mode) {
super(parent, title, mode);
init();
}
private void init() {
setSize(450, 180);
Panel p = new Panel();
p.setLayout(null);
Label l1 = new Label(”Audio Device(s)”);
Label l2 = new Label(”Video Device(s)”);
Label l3 = new Label(”Audio Format(s)”);
Label l4 = new Label(”Video Format(s)”);
audioDeviceCombo = new Choice();
videoDeviceCombo = new Choice();
audioFormatCombo = new Choice();
videoFormatCombo = new Choice();
Button OKbutton = new Button(”OK”);
Button cancelButton = new Button(”Cancel”);
p.add(l1);
l1.setBounds(5, 5, 100, 20);
p.add(audioDeviceCombo);
audioDeviceCombo.setBounds(115, 5, 300, 20);
p.add(l3);
l3.setBounds(5, 30, 100,20);
p.add(audioFormatCombo);
audioFormatCombo.setBounds(115, 30, 300,20);
p.add(l2);
l2.setBounds(5, 55, 100, 20);
p.add(videoDeviceCombo);
videoDeviceCombo.setBounds(115, 55, 300, 20);
p.add(l4);
l4.setBounds(5, 80, 100, 20);
p.add(videoFormatCombo);
videoFormatCombo.setBounds(115, 80, 300, 20);
p.add(OKbutton);
OKbutton.setBounds(280, 115, 60, 25);
p.add(cancelButton);
cancelButton.setBounds(355, 115, 60, 25);
add(p, “Center”);
audioDeviceCombo.addItemListener(this);
videoDeviceCombo.addItemListener(this);
OKbutton.addActionListener(this);
cancelButton.addActionListener(this);
//get all the capture devices
devices = CaptureDeviceManager.getDeviceList ( null );
CaptureDeviceInfo cdi;
if (devices!=null && devices.size()>0) {
int deviceCount = devices.size();
audioDevices = new Vector();
videoDevices = new Vector();
Format[] formats;
for ( int i = 0; i < deviceCount; i++ ) {
cdi = (CaptureDeviceInfo) devices.elementAt ( i );
formats = cdi.getFormats();
for ( int j=0; j<formats.length; j++ ) {
if ( formats[j] instanceof AudioFormat ) {
audioDevices.addElement(cdi);
break;
}
else if (formats[j] instanceof VideoFormat ) {
videoDevices.addElement(cdi);
break;
}
}
}
//populate the choices for audio
for (int i=0; i<audioDevices.size(); i++) {
cdi = (CaptureDeviceInfo) audioDevices.elementAt(i);
audioDeviceCombo.addItem(cdi.getName());
}
//populate the choices for video
for (int i=0; i<videoDevices.size(); i++) {
cdi = (CaptureDeviceInfo) videoDevices.elementAt(i);
videoDeviceCombo.addItem(cdi.getName());
}
displayAudioFormats();
displayVideoFormats();
} // end if devices!=null && devices.size>0
else {
//no devices found or something bad happened.
}
}
void displayAudioFormats() {
//get audio formats of the selected audio device and repopulate the audio format combo
CaptureDeviceInfo cdi;
audioFormatCombo.removeAll();
int i = audioDeviceCombo.getSelectedIndex();
//i = -1 –> no selected index
if (i!=-1) {
cdi = (CaptureDeviceInfo) audioDevices.elementAt(i);
if (cdi!=null) {
Format[] formats = cdi.getFormats();
audioFormats = new Vector();
for (int j=0; j<formats.length; j++) {
audioFormatCombo.add(formats[j].toString());
audioFormats.addElement(formats[j]);
}
}
}
}
void displayVideoFormats() {
//get audio formats of the selected audio device and repopulate the audio format combo
CaptureDeviceInfo cdi;
videoFormatCombo.removeAll();
int i = videoDeviceCombo.getSelectedIndex();
//i = -1 –> no selected index
if (i!=-1) {
cdi = (CaptureDeviceInfo) videoDevices.elementAt(i);
if (cdi!=null) {
Format[] formats = cdi.getFormats();
videoFormats = new Vector();
for (int j=0; j<formats.length; j++) {
videoFormatCombo.add(formats[j].toString());
videoFormats.addElement(formats[j]);
}
}
}
}
public CaptureDeviceInfo getAudioDevice() {
CaptureDeviceInfo cdi = null;
if (audioDeviceCombo!=null) {
int i = audioDeviceCombo.getSelectedIndex();
cdi = (CaptureDeviceInfo) audioDevices.elementAt(i);
}
return cdi;
}
public CaptureDeviceInfo getVideoDevice() {
CaptureDeviceInfo cdi = null;
if (videoDeviceCombo!=null) {
int i = videoDeviceCombo.getSelectedIndex();
cdi = (CaptureDeviceInfo) videoDevices.elementAt(i);
}
return cdi;
}
public Format getAudioFormat() {
Format format = null;
if (audioFormatCombo!=null) {
int i = audioFormatCombo.getSelectedIndex();
format = (Format) audioFormats.elementAt(i);
}
return format;
}
public Format getVideoFormat() {
Format format = null;
if (videoFormatCombo!=null) {
int i = videoFormatCombo.getSelectedIndex();
format = (Format) videoFormats.elementAt(i);
}
return format;
}
public boolean hasConfigurationChanged() {
return configurationChanged;
}
public void actionPerformed(ActionEvent ae) {
String command = ae.getActionCommand().toString();
if (command.equals(”OK”)) {
configurationChanged = true;
}
dispose();
}
public void itemStateChanged(ItemEvent ie) {
System.out.println(ie.getSource().toString());
if (ie.getSource().equals(audioDeviceCombo))
displayAudioFormats();
else
displayVideoFormats();
}
}
Itu adalah class untuk menangani user yang akan memilih format dari video dan audio yang akan di capture. Selanjutnya, kita tambahkan method capture pada JConference kita.
Pada action File–>Capture, kita ubah
System.out.println(”Sementara”);
menjadi
capture();
Selanjutnya kita tambahkan method capture() dan method-method yang mendukungnya
void registerDevices() {
CaptureDeviceDialog cdDialog = new
CaptureDeviceDialog(this, “Capture Device”, true);
cdDialog.setVisible(true);
if (!cdDialog.hasConfigurationChanged())
return;
//configuration has changed, update variables.
audioCDI = cdDialog.getAudioDevice();
if (audioCDI!=null) {
audioDeviceName = audioCDI.getName();
System.out.println(”Audio Device Name: ” + audioDeviceName);
}
videoCDI = cdDialog.getVideoDevice();
if (videoCDI!=null) {
videoDeviceName = videoCDI.getName();
System.out.println(”Video Device Name: ” + videoDeviceName);
}
//Get formats selected, to be used for creating DataSource
videoFormat = cdDialog.getVideoFormat();
audioFormat = cdDialog.getAudioFormat();
}
public synchronized void controllerUpdate(ControllerEvent event) {
System.out.println(event.toString());
if (event instanceof RealizeCompleteEvent) {
Component comp;
System.out.println(”Adding visual component”);
if ((comp = dualPlayer.getVisualComponent()) != null)
add (”Center”, comp);
System.out.println(”Adding control panel”);
if ((comp = dualPlayer.getControlPanelComponent()) != null)
add(”South”, comp);
validate();
}
}
void capture() {
if (audioCDI==null && videoCDI==null)
registerDevices();
try {
if (!(audioCDI==null && videoCDI==null)) {
DataSource[] dataSources = new DataSource[2];
System.out.println(”Creating data sources.”);
dataSources[0] = Manager.createDataSource(audioCDI.getLocator());
dataSources[1] = Manager.createDataSource(videoCDI.getLocator());
DataSource ds = Manager.createMergingDataSource(dataSources);
dualPlayer = Manager.createPlayer(ds);
dualPlayer.addControllerListener(this);
dualPlayer.start();
}
else
System.out.println(”CDI not found.”);
}
catch (Exception e) {
System.out.println(e.toString());
}
}
Post selanjutnya kita akan membahas tentang transmit receive paket-paket RTP (Real Time Protocol), protokol yang kita pakai untuk aplikasi kita.