package org.jcodec.player.app;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import javax.swing.JFrame;
import org.jcodec.common.IOUtils;
import org.jcodec.common.model.RationalLarge;
import org.jcodec.player.Player;
import org.jcodec.player.Stepper;
import org.jcodec.player.filters.JCodecVideoSource;
import org.jcodec.player.filters.JSoundAudioOut;
import org.jcodec.player.filters.audio.AudioMixer;
import org.jcodec.player.filters.audio.AudioMixer.Pin;
import org.jcodec.player.filters.audio.AudioSource;
import org.jcodec.player.filters.audio.JCodecAudioSource;
import org.jcodec.player.filters.http.HttpMedia;
import org.jcodec.player.filters.http.HttpPacketSource;
import org.jcodec.player.ui.SwingVO;
/**
* This class is part of JCodec ( www.jcodec.org ) This software is distributed
* under FreeBSD License
*
* @author The JCodec project
*
*/
public class PlayerMain implements KeyListener {
private Player player;
private Stepper stepper;
private JCodecVideoSource video;
private SwingVO vo;
private AudioMixer mixer;
public static void main(String[] args) throws Exception {
if (args.length < 1) {
System.out.println("Syntax: <url>");
return;
}
new PlayerMain(new URL(args[0]));
}
public PlayerMain(URL url) throws IOException {
JFrame frame = new JFrame("Player");
vo = new SwingVO();
frame.getContentPane().add(vo, BorderLayout.CENTER);
// Finish setting up the frame, and show it.
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
vo.setVisible(true);
File cacheWhere = new File(System.getProperty("user.home"), "Library/JCodec");
IOUtils.forceMkdir(cacheWhere);
HttpMedia http = new HttpMedia(url, cacheWhere);
final HttpPacketSource videoTrack = http.getVideoTrack();
video = new JCodecVideoSource(videoTrack);
List<HttpPacketSource> audioTracks = http.getAudioTracks();
AudioSource[] audio = new AudioSource[audioTracks.size()];
for (int i = 0; i < audioTracks.size(); i++) {
audio[i] = new JCodecAudioSource(audioTracks.get(i));
}
mixer = new AudioMixer(2, audio);
player = new Player(video, mixer, vo, new JSoundAudioOut());
frame.addKeyListener(this);
frame.pack();
frame.setVisible(true);
frame.setSize(new Dimension(768, 596));
player.play();
}
public void keyTyped(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SPACE) {
if (player.getStatus() == Player.Status.PAUSED) {
if (stepper != null) {
player.seek(stepper.getPos());
stepper = null;
}
player.play();
} else
player.pause();
} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
RationalLarge pos = player.getPos();
player.seek(new RationalLarge(pos.getNum() - pos.getDen() * 15, pos.getDen()));
} else if (e.getKeyCode() == KeyEvent.VK_UP) {
RationalLarge pos = player.getPos();
player.seek(new RationalLarge(pos.getNum() + pos.getDen() * 15, pos.getDen()));
} else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
// if (player.getStatus() != Player.Status.PAUSED) {
// player.pause();
// return;
// }
//
// try {
// if (stepper == null) {
// stepper = new Stepper(video, mixer, vo, new JSoundAudioOut());
// stepper.setListeners(player.getListeners());
// stepper.gotoFrame(player.getFrameNo());
// }
// stepper.prev();
// } catch (IOException e1) {
// System.out.println("Couldn't step " + e1.getMessage());
// }
} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
if (player.getStatus() != Player.Status.PAUSED) {
player.pause();
return;
}
try {
if (stepper == null) {
stepper = new Stepper(video, mixer, vo, new JSoundAudioOut());
stepper.setListeners(player.getListeners());
stepper.gotoFrame(player.getFrameNo());
}
stepper.next();
} catch (IOException e1) {
System.out.println("Couldn't step " + e1.getMessage());
}
} else if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
player.destroy();
System.exit(-1);
} else if (e.getKeyChar() >= '0' && e.getKeyChar() < '9') {
int ch = e.getKeyChar() - '0';
for (Pin pin : mixer.getPins()) {
if (ch < pin.getLabels().length) {
pin.toggle(ch);
break;
} else
ch -= pin.getLabels().length;
}
}
}
}