我尝试使用VLCj来访问网络摄像头。我正在使用此代码:
public static void main(String[] args) {
// Create player.
MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory();
DirectMediaPlayer mediaPlayer = mediaPlayerFactory.newDirectMediaPlayer(
320, 240,
new RenderCallback() {
@Override
public void display(Memory arg0) {
// Do nothing.
}
});
// Options setup.
String[] options = new String[]{};
String mrl = "v4l2:///dev/video0"; // Linux
// Start preocessing.
mediaPlayer.startMedia(mrl, options);
BufferedImage bufImg;
for (int i = 0; i < 1000; ++i) {
bufImg = mediaPlayer.getSnapshot();
// Do something with BufferedImage...
// ...
}
// Stop precessing.
mediaPlayer.stop();
mediaPlayer = null;
System.out.println("Finish!");
}
此代码部分有效 - 我可以使用BufferedImage
,但是:
[0x7f0a4c001268] main vout display error: Failed to set on top
Finish!
消息,但程序没有将控制权返回到IDE或控制台。UPD: 我正在使用openSUSE 12.2 x64,VLC 2.0.3安装并正常运行所有视频文件,库VLCj 2.1.0。
答案 0 :(得分:3)
此代码正常运行:
public static void main(String[] args) {
// Configure player factory.
String[] VLC_ARGS = {
"--intf", "dummy", // no interface
"--vout", "dummy", // we don't want video (output)
"--no-audio", // we don't want audio (decoding)
"--no-video-title-show", // nor the filename displayed
"--no-stats", // no stats
"--no-sub-autodetect-file", // we don't want subtitles
"--no-inhibit", // we don't want interfaces
"--no-disable-screensaver", // we don't want interfaces
"--no-snapshot-preview", // no blending in dummy vout
};
MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory(VLC_ARGS);
// Create player.
HeadlessMediaPlayer mediaPlayer = mediaPlayerFactory.newHeadlessMediaPlayer();
// Select input device.
String mrl = "v4l2:///dev/video0"; // Linux
// Start processing.
mediaPlayer.startMedia(mrl);
BufferedImage bufImg;
for (int i = 0; i < 1000; ++i) {
bufImg = mediaPlayer.getSnapshot();
// Do something with BufferedImage...
// ...
}
// Stop processing.
mediaPlayer.stop();
// Finish program.
mediaPlayer.release();
mediaPlayerFactory.release();
}
答案 1 :(得分:2)
恢复原生窗口:VLCj打开VLC库的共享实例。
无头媒体播放器不打算播放视频或音频!
事实上,如果您需要播放任何内容(而不是流向其他任何地方),您需要创建输出窗口或使用直接媒体播放器(可能要复杂得多) 因此,如果无头玩家需要玩某些东西,它会打开一个原生窗口来执行播放!
来源:http://www.capricasoftware.co.uk/wiki/index.php?title=Vlcj_Media_Players
重新出错:视频显示组件必须是面板,窗口或其添加的顶级组件。否则会抛出错误
主vout显示错误:无法设置在顶部
此外,如果您在组件上放置任何内容,它将销毁视频输出,这将不再有效!
无论如何,我不知道DirectMediaPlayer是如何工作的,但是VLCj有一些奇怪的行为......也许getSnapshot()
需要一个视频显示组件,但我不确定。
重新开始你没有完成的程序:你加入完成自己的线程。这无法正常工作,因为您的线程会睡觉&#34;直到等待的另一个线程已被终止,但由于这是你自己的线程,它会睡觉#34;并且不会终止。 您可以使用main方法中的此短代码测试此行为:
System.out.println("Test start");
Thread.currentThread().join();
System.out.println("Test stop");
您将从不到达&#34;测试停止&#34;言。