如何使用VLCJ和JavaFX播放视频文件?

如何使用VLCJ和JavaFX播放视频文件?,java,video,javafx,vlc,vlcj,Java,Video,Javafx,Vlc,Vlcj,我知道JavaFX有自己的媒体播放器,但我不知道它是否可以播放MP4文件。 即使可以,我还是更愿意使用VLCJ,因为VLC支持的格式和种类比我在近乎紧张状态下所能计数的还要多 我遵循了Caprical在其VLCJ JavaFX GitHub中发布的示例,但它没有做任何事情。 它不会出错,但它什么也不做 查看代码,问题似乎出在时间轴事件处理程序中: private final EventHandler<ActionEvent> nextFrame = new EventHandler&

我知道JavaFX有自己的媒体播放器,但我不知道它是否可以播放MP4文件。 即使可以,我还是更愿意使用VLCJ,因为VLC支持的格式和种类比我在近乎紧张状态下所能计数的还要多

我遵循了Caprical在其VLCJ JavaFX GitHub中发布的示例,但它没有做任何事情。 它不会出错,但它什么也不做

查看代码,问题似乎出在时间轴事件处理程序中:

private final EventHandler<ActionEvent> nextFrame = new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent t) {
        Memory[] nativeBuffers = mediaPlayerComponent.getMediaPlayer().lock();
        if (nativeBuffers != null) { //<-----This is always NULL so everything in the block is skipped . . . 
            // FIXME there may be more efficient ways to do this...
            // Since this is now being called by a specific rendering time, independent of the native video callbacks being
            // invoked, some more defensive conditional checks are needed
            Memory nativeBuffer = nativeBuffers[0];
            if (nativeBuffer != null) {
                ByteBuffer byteBuffer = nativeBuffer.getByteBuffer(0, nativeBuffer.size());
                BufferFormat bufferFormat = ((DefaultDirectMediaPlayer) mediaPlayerComponent.getMediaPlayer()).getBufferFormat();
                if (bufferFormat.getWidth() > 0 && bufferFormat.getHeight() > 0) {
                    pixelWriter.setPixels(0, 0, bufferFormat.getWidth(), bufferFormat.getHeight(), pixelFormat, byteBuffer, bufferFormat.getPitches()[0]);
                }
            }
        }
        mediaPlayerComponent.getMediaPlayer().unlock();
    };
};
private final EventHandler nextFrame=new EventHandler(){
@凌驾
公共无效句柄(ActionEvent t){
内存[]nativeBuffers=mediaPlayerComponent.getMediaPlayer().lock();
如果(nativeBuffers!=null){//0&&bufferFormat.getHeight()>0){
pixelWriter.setPixels(0,0,bufferFormat.getWidth(),bufferFormat.getHeight(),pixelFormat,byteBuffer,bufferFormat.GetPitchs()[0]);
}
}
}
mediaPlayerComponent.getMediaPlayer().unlock();
};
};

有人建议我去拿日志,但那得等我在写这篇文章时陷入无意识(当我回到生命之地时,我会看看我能做些什么来发布一些日志)。如果有更好的方法实现这一点,如果有人能指点我,我完全赞成。谢谢…

Github项目上的vlcj javafx示例工作正常

你在问题中说vlcj“没有错误,但它什么也不做”

嗯,有两种方法可以检查你在问题中发布的代码中没有显示的错误

  • mediaPlayer.playMedia()
    方法返回一个
    boolean
    来说明VLC是否接受您的MRL-您是否检查了返回值?请注意,即使此方法返回true,也不表示VLC可以播放您的媒体,但如果返回false,则表示无法播放
  • 您应该在媒体播放器中添加一个
    MediaPlayerEventList
    ,并提供“playing()”和“error()”的实现。这些回调将异步触发——因为LibVLC就是这样工作的——只有这样,您才能断定vlcj是“没有错误”还是“什么都不做”

  • 我怀疑您的媒体无法启动,可能是因为文件名错误。

    nativeBuffers始终为空,因为您的视频没有播放。好的,我现在将它指向正确的位置,但播放返回false,我收到错误“未能为'C:/path/to/video.mp4'创建本机媒体资源”好的,无需担心。结果是它不太关心路径中的“/”。谢谢。您需要意识到,路径实际上是传递给本机函数的——因此,尽管Java允许您在任何平台上互换使用“/”或“\”作为文件名,但本机函数并非如此。在Windows上必须使用“\”,在Linux上必须使用“/”。