package bce.client.player;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Player {
private static final String MPLAYER = "/usr/bin/mplayer";
private static Player player;
private Process process;
private InputStream stderr;
private InputStream stdin;
private Thread stdinThread;
private Thread stderrThread;
private boolean isStarted;
private volatile boolean isRunning;
private String[] cmd;
static {
if (player == null)
player = new Player();
}
private Player() {
this.isStarted = false;
this.isRunning = false;
}
public static Player getInstance() {
return player;
}
public synchronized void start(String videoFileName, int hWnd) throws IOException {
if (this.isStarted)
return;
// 调用mplayer命令行
this.cmd = new String[] {
MPLAYER, // mplayer路径
"-vo", "x11", // linux下只能用x11和xv还有一个神码的,windows下用directX
"-identify", // 输出详情
"-slave", // slave模式播放
"-wid", String.valueOf(hWnd), // 视频窗口的 handle
"-colorkey", "0x010101", // 视频窗口的背景色
"-osdlevel", String.valueOf(1), // osd样式
videoFileName // 播放文件路径
};
this.process = Runtime.getRuntime().exec(cmd);
this.stderr = process.getErrorStream();
this.stdin = process.getInputStream();
this.isRunning = true;
this.stderrThread = new Thread(new Runnable() {
@Override
public void run() {
try {
final BufferedReader errReader = new BufferedReader(new InputStreamReader(stderr, "UTF-8"));
for (String l = errReader.readLine(); l != null; errReader.readLine()) {
if (!isRunning)
break;
// System.out.println(l);
}
} catch (Throwable t) {
t.printStackTrace();
}
}
});
this.stderrThread.start();
this.stdinThread = new Thread(new Runnable() {
@Override
public void run() {
try {
final BufferedReader inReader = new BufferedReader(new InputStreamReader(stdin, "UTF-8"));
for (String l = inReader.readLine(); l != null; l = inReader.readLine()) {
if (!isRunning)
break;
// System.out.println(l);
}
} catch (Throwable t) {
t.printStackTrace();
}
}
});
this.stdinThread.start();
this.isStarted = true;
}
public void stop() {
if (this.process == null)
return;
this.isRunning = false;
try {
Thread.sleep(100);
this.stderr.close();
this.stdin.close();
} catch (Exception e) {
e.printStackTrace();
}
this.process.destroy();
this.isStarted = false;
}
public Process getProcess() throws IOException {
if (this.process != null)
return this.process;
return null;
}
public InputStream getStderr() {
return stderr;
}
public InputStream getStdin() {
return stdin;
}
public Thread getStdinThread() {
return stdinThread;
}
public Thread getStderrThread() {
return stderrThread;
}
public boolean isStarted() {
return isStarted;
}
public boolean isRunning() {
return isRunning;
}
}