我必须在Java / OpenGL应用程序中播放相当大的视频,在某些情况下是UHD(4000x2000)。我现在已经在VLCJ中解决了这个问题(无法让GStreamer快速解码)。 当使用普通的嵌入式播放器时,VLC本身和VLCJ一样播放视频。
当我使用直播播放器时,较大的视频开始播放并在几帧后停止或者根本不启动(仍然会调用display(),但始终使用相同的帧!)。对我来说,从HDReady(1280x720仍然可以正常播放)和FullHD(1920x1080)之间开始。这似乎并不取决于PC的性能。我在一台5岁的笔记本电脑和高端机器上测试了这个结果,结果完全相同。 如果我做错了或者VLCJ DirectPlayer无法处理更大的视频,那么有什么想法吗?
我正在使用VLC 2.0.0(也尝试过2.0.3和2.0.4)以及来自github的最新VLCJ。
我在线登录:http://pastebin.com/UeyMrVmW
我附上了一个简单的例子,说明我如何设置重新创建问题的直接播放器。
public class VLCTestPlayer implements RenderCallback, BufferFormatCallback {
protected MediaPlayerFactory mediaPlayerFactory;
protected DirectMediaPlayer mediaPlayer;
public static void main(final String[] args) {
NativeLibrary.addSearchPath("libvlc",
"C:\\Program Files (x86)\\VideoLAN\\VLC");
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
VLCTestPlayer testplayer = new VLCTestPlayer(args);
}
});
}
private VLCTestPlayer(String[] args) {
JFrame frame = new JFrame("vlcj Tutorial");
mediaPlayerFactory = new MediaPlayerFactory("--no-video-title-show", "--verbose=3");
mediaPlayer = mediaPlayerFactory.newDirectMediaPlayer(this, this);
String videoFile = "myVideo.mp4";
boolean started = mediaPlayer.prepareMedia(videoFile);
if (started)
mediaPlayer.play();
System.out.println("Video started: " + started + " from: " + videoFile);
frame.setLocation(100, 100);
frame.setSize(1050, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
@Override
public BufferFormat getBufferFormat(int sourceWidth, int sourceHeight) {
sourceWidth = sourceWidth / 1;
sourceHeight = sourceHeight / 1;
System.out.println("Got VideoFormat: " + sourceWidth + "x"
+ sourceHeight);
BufferFormat format = new BufferFormat("RGBA", sourceWidth,
sourceHeight, new int[] { sourceWidth * 4 },
new int[] { sourceHeight });
return format;
}
@Override
public void display(DirectMediaPlayer mediaPlayer, Memory[] nativeBuffers,
BufferFormat bufferFormat) {
ByteBuffer buffer = nativeBuffers[0].getByteBuffer(0,
(int) bufferFormat.getWidth() * (int) bufferFormat.getHeight()
* 4);
int pos = 4 * ((int) bufferFormat.getWidth()
* (int) bufferFormat.getHeight() / 2 + (int) bufferFormat
.getWidth() / 2) + 700;
System.out.println("Got VideoFrame: " + buffer.get(pos) + ":"
+ buffer.get(pos + 1) + ":" + buffer.get(pos + 2) + ":"
+ buffer.get(pos + 3));
}
}
答案 0 :(得分:1)
我会说这几乎肯定是一个性能问题,尽管你的测试 - 根据我的经验,即使在现代系统上以直接播放器播放高清视频,你在那里的方式也行不通,如果没有硬件加速,它就赢了不应对。作为一个粗略的指南,我6个月大的i5台式机几乎无法管理720p视频。 (作为旁注,你在那里的println陈述肯定无济于事,如果一次多次完成,他们可能会花费比你想象的更多的时间。)
但是,节省的优势是您应该能够使用JavaFX及其提供的硬件加速类来使其工作 - 有关详细信息,请参阅here。