处理Java中的视频(DVD,.avi .mkv)

30

在搜索适合 Java 播放视频的库时,我遇到了一些麻烦。大家都在喊不要使用 JMF,因为它已经过时、老旧,还要求用户自行安装;其他替代方案如 VLCJ,如果能够正常工作,似乎也不太稳定,并且依赖于大量的本地代码;至于处理 DVD,则很难在免费库中找到。

当前可选方案:

  • 现在 JavaFX 2 正在 gaining momentum(获得动能),这是我一直在认真研究的东西(因此提出了我的问题 here),但迄今为止,我尝试了很多方法,仍然不能使其播放除标准 FLV 视频以外的任何内容。
  • VLCJ 做的事情很好(请参见我的当前答案),目前我正在使用它。它使用 libvlc 基本上可以做任何事情,例如播放几乎任何文件并可立即播放 DVD。最大的问题是你必须为每个播放器使用多个虚拟机才能使其稳定运行,这意味着响应相对较慢。我还没有在 Mac 上使这种方法工作。
  • JMF 过时且可怕,不是我考虑的选项。我以前曾使用过它,但那次经历并不好!
  • FMJ 声称是 JMF 的替代品,但我和其他大多数人一样都无法使它正常工作,这本身就让我对其质量和理解能力感到担忧,即使我成功地使其工作了!
  • Xuggler 在做低级别的转码工作方面做得非常好,有着绝佳的教程,并且编写得非常好。但是,虽然它很适合这项工作,但播放视频、获取正确顺序和同步的帧等操作却很难正常工作,而且还增加了更多的代码,这意味着要进行更多的维护,可能会出现更多的错误等等...
  • 我还没有尝试过GStreamer-Java,虽然它似乎不支持DVD播放(这是一个我正在开发的开源应用程序,商业插件不是选项),而且它的编解码器支持似乎不是最广泛的。
  • JCodec 是一个有趣的尝试,也是我见过的唯一一个从纯Java角度实现视频支持的项目 - 但目前格式支持不足,而且它是一个相对较新的项目。
  • 为每个想要支持的平台编写一个不同的原生库。由于需要额外的维护和编码时间,这是绝对最后的选择。
  • 基于以上内容(或其他任何你能想到的),人们会推荐哪些选项?是否有其他明智的选择我没有列出?或者在不久的将来是否会有其他选择?


    1
    只要你可以使用发布的版本,并且没有期望修复或更新,Xuggler就非常棒。现在它几乎是自助的。 - Paul Gregoire
    @Mondain 对于较低级别的转码工作来说非常好,但如果你只想构建一个媒体播放器,那么需要大量的工作才能使相对简单的功能正常工作(例如寻找)。 - Michael Berry
    7个回答

    13

    在研究了不同选择并尝试过一些选项后,我最终选择了VLCJ。但是有一个问题-所有的VLCJ都是在外部进程的虚拟机中完成的。这有点更加复杂(请参见这里,了解我如何做到的),但之后你可以随心所欲地使用它,并且它很好用(目前正在使用3个外部播放器,没有稳定性问题)。

    Xuggler很棒,但对我来说太低级了-为了让回放和寻找工作正常工作而需要重新发明轮子(而且还是一个更糟糕的轮子),这使我有些望而却步;我感觉可能需要很长时间才能解决它的所有问题。但对于编码/转码/其他低级视频工作,我毫无保留地推荐它-毫无疑问是最好的选择。

    我选择的方法有什么注意事项吗?如果外部虚拟机没有被显式关闭,它们将在应用程序退出后继续在后台播放视频,并且使用此方法会使调试变得更加困难。我还没有验证它是否可以在Mac上运行,而且我的初步建议可能不行,因为据我所知,MacOS不允许一个进程控制另一个进程的窗口,除非使用本机代码进行明确许可。但是,通过一些工作,应该可以解决这个问题。

    作为我目前正在开发的项目的衍生产品,我可能会尝试将所有这些外部进程功能包装在一个简单的Java视频框架中,该框架在VLCJ下面运行。如果有人对此感兴趣(我不能保证什么,但我收到的兴趣越多,我就越有可能去做),请随时让我知道!

    在我的研究和调查后,我建议使用VLCJ(但一定要使用独立进程播放器),如果您只想播放/录制/流传视频内容,使用Xuggler如果您想对编解码器进行任何低级别的视频处理。在撰写本文时,没有优雅、纯粹的Java解决方案,并且可能会保持这种状态一段时间-幸运的是,可以通过跨平台本地库获得不错的结果,只需要更多的工作!


    1
    没错。我已经尝试了所有的库,只有 Xuggler 和 VLCJ 运行成功(感谢您推荐 VLCJ,STACK)。我决定使用 VLCJ,因为 Xuggler 没有相机支持。目前我开发了一个应用程序,使用 VLCJ 从 2 个不同的摄像头和桌面流式传输到 3 个分开的 .flv 文件中,并且它能够正常工作。但是我没有使用外部进程...说实话,在你回答我的问题之前,我从未听说过外部进程播放器。我现在要去读你的文章了。 - vale4674
    目前有什么最好的推荐吗?因为这篇文章已经写于5年前,我希望现在可能会有一些新的库。有吗? - kuhajeyan
    @kuhajeyan 唯一真正改变的是,一些在同一虚拟机中具有多个VLCJ实例的错误已得到修复,但据我所知并非全部。至少我不知道有任何其他基于Java的库提供更好的支持。 - Michael Berry
    @berry120 谢谢,我也是。最终不得不转向使用 vlcj,我最初的意图是让所有内容都在内部运行,如果 xuggler 仍然活跃,感觉会很好。很遗憾看到它已经不再更新。 - kuhajeyan
    我不得不使用自定义流来实时解密mp4并通过内存缓冲区(imem)将数据传递给vlclib。这样做非常慢,导致mp4视频需要20-30秒才能启动。每次读取都必须通过JNI完成。你有什么其他的想法吗? - ed22
    @MichaelBerry vlcj运行在外部的唯一原因是,否则应用程序会在某个时刻崩溃?我之所以问这个问题,是因为在vlcj长时间运行后,我遇到了这种情况。在某些时候它会卡住,但没有明显的原因 - 查看日志,没有任何异常堆栈跟踪的迹象。也许有一个静默崩溃,但到目前为止我还没有找到它。 - Victor

    2

    我在一些项目中使用了jffmeg(ffmeg的Java绑定),到目前为止我还没有遇到任何问题。http://jffmpeg.sourceforge.net/documentation.html。我也使用过qt-jambi,但从未尝试过它的视频库(phonon),这也可以解决你的问题。


    jffmpeg难道不只是JMF的编解码器包而不是媒体库吗? - Michael Berry

    1

    我同意要避免使用JMF,特别是如果你想播放DVD。即使JMF也依赖于一些本地代码来实现其功能。无论如何,你可能无法避免某种形式的本地依赖关系。另一个选择是FMJ。它是JMF的开源版本。但我用它并没有太多好运。

    我的建议是使用VLCJ。当我需要媒体解决方案时,我正在探索它。不幸的是,它是在GPL下发布的,所以我不能在我的应用程序中使用它,但它似乎应该能够处理你想要的。

    此外,我的其他帖子可能对你有兴趣。链接

    此外,这个可能会有用。


    我以前也尝试过使用FMJ,但是没有成功,而且我还与其他人交流过,他们也遇到了类似的情况!对于VLCJ,我有两种想法-表面上看它非常好,具有强大的媒体支持,并且针对多个平台有本地二进制文件。但是,当我使用它时,我遇到了大量崩溃(我指的是完全的VM崩溃,而不仅仅是错误和异常被抛出),这让我感到恐怖。希望这种情况将来会得到改善,但对于像我现在正在开发的用户友好型应用程序来说,这很遗憾,因为它已经被排除在外了。 - Michael Berry
    我知道,他们以它作为一个可替换的东西而自豪......如果那真的那么容易就好了。我实际上从来没有去尝试过VLCJ,但因为它如此不稳定肯定会给你带来一些严重的问题。Java真的缺乏一个好的最新的多媒体解决方案。你可能会发现我的其他帖子关于在不需要显式安装JMF的情况下使用它很有趣。我喜欢它。 - user489041
    谢谢你提供的链接 - 我之前在搜索时就看到了那个答案,解决安装程序问题真是太好了!我无法让VLCJ可靠地工作。它一开始就会在做任何事情之前崩溃,然后当我设法让它工作时,它又会在看似随机的时间崩溃。这很遗憾,因为如果它“只是工作”,那就正是我所需要的! - Michael Berry

    1

    我还没有尝试过使用它们,但如果我正在使用JavaFX,我更愿意等到2.0版本发布并且那个可怕的JavaFX脚本被弃用。当前版本的JavaFX在桌面上是可行的,但我看到的所有使用视频的示例都相当粗糙,并且通常依赖于可能会因版本更改而发生变化的内部机制。 - Michael Berry

    1
    尝试使用 Xuggler,它在Java中包装了著名的FFmpeg库。

    Xuggler看起来很有前途,我目前正在使用它并取得了良好的结果。谢谢! - Michael Berry
    1
    顺便提一下,如果其他人也在看这个问题,Xuggle 已经停止维护多年了(http://www.xuggle.com/xuggler/status)。 - Michael Berry

    1

    我可以推荐gstreamer-java绑定。顾名思义,它将GStreamer API封装在Java类中。这样,您就可以访问GStreamer提供的媒体处理图形能力。如果您想执行转码等更高级任务,这非常方便。

    此外,如果我没记错的话,GStreamer还有一个商业插件,支持DVD播放,并附带CSS许可证。如果这对您的用例不重要,您也可以选择开源的(这是我所需的唯一一个)。


    gstreamer-java 看起来很有前途,谢谢。我会试着玩一下,看看能做些什么! - Michael Berry

    0

    我目前正在使用OpenImaj库http://openimaj.org/tutorial,它具有

    XuggleVideo and XuggleAudio class
    

    我建议您使用它并实现自己的线程机制来播放它们。我目前正在开发一个媒体播放器,希望能够很好地播放“流行”的视频格式,因为...
    VideoDisplay class
    

    这个库的工作做得很好,但播放有点卡顿。该库是以swing为主要实现方式的,附加的

    ImageComponent 
    

    在JavaFx中,将Swing节点添加似乎无法正常工作,但是我现在能够显示视频中的图像,并希望这方面会有所进展。


    根据其他评论,我会谨慎使用任何基于Xuggle的东西,因为它已经多年没有更新了。此外,它是一个相当低层次的库,更适合处理单个帧而不是实际视频播放。 - Michael Berry

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接