如何使用VLCJ和JavaFX播放视频文件?
我知道JavaFX有自己的媒体播放器,但我不知道它是否可以播放MP4文件。 即使可以,我还是更愿意使用VLCJ,因为VLC支持的格式和种类比我在近乎紧张状态下所能计数的还要多 我遵循了Caprical在其VLCJ JavaFX GitHub中发布的示例,但它没有做任何事情。 它不会出错,但它什么也不做 查看代码,问题似乎出在时间轴事件处理程序中:如何使用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&
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上必须使用“/”。