用Java处理video(DVD,.avi .mkv)

在寻找一个体面的图书馆来播放Javavideo后,我已经不知所措了。 周围的每个人都在尖叫不要使用JMF,因为它已经过时,过时而且需要用户安装它,其他替代品如VLCJ看起来很好,如果它们工作但仍然相对不稳定并且依赖大量的本机代码,以及处理DVD,在免费图书馆看起来像金尘!

当前选项:

  • 现在JavaFX 2正在获得动力,这是我一直在认真研究的东西(因此我的问题在这里 )但是到目前为止我没有运气试图弄清楚如何让它比标准的FLVvideo更糟糕。
  • VLCJ的工作做得很好(参见我目前的答案),目前我正在努力。 它使用libvlc来做任何事情,因为它可以播放几乎任何文件并且开箱即用DVD。 最大的问题是你必须为每个玩家使用多个VM才能使其稳定运行,这意味着响应速度相对较慢。 我还没有这种方法在Mac上工作。
  • JMF是荒谬的过时,可怕的,就我而言,并不是一个真正的选择。 我过去玩过它,经验不是很好!
  • FMJ表示这是JMF的替代品。 我还没有像我和其他大多数人一样努力工作,这本身就让我对它的质量和理解感到厌倦,即使我确实让它变得有效!
  • Xuggler非常适合它的function,它有很棒的教程,而且编写得非常好。 但是虽然它对于低级转码工作很有用,播放video并以正确的顺序获得帧并同步等等只是一个噩梦才能正常工作,并再次添加更多代码,这意味着更多的维护,可能更多的错误等等…
  • 我还没有尝试过任何愤怒的GStreamer-Java,虽然它似乎不支持DVD播放(它是一个我正在研究的开源应用程序,所以商业插件也不是一个选项)并且它的编解码器支持不会似乎是最宽的。
  • JCodec是一项有趣的工作,是我见过的唯一一个从纯Java角度实现video支持的工作 – 但目前缺乏对格式的支持,这是一个相对较新的项目。
  • 为我想要支持的每个平台在不同的本地库中编写一些东西。 这是绝对的最后选择,因为它需要额外的维护和编码时间。

基于上述(或其他任何你能想到的),人们会推荐哪些选项,还有其他任何我错过的合理选择吗? 或者其他人认为可能在不久的将来有空?

在对不同选项进行了大量研究并尝试了一些之后,我毕竟已经使用了VLCJ,但是这里有一个问题 – 所有VLCJ的东西都是在进程VM之外完成的。 设置起来有点复杂(请参阅这里我是如何做到的),但之后你可以抛出所有你喜欢它并且它工作正常(目前使用3个没有稳定性问题的进程中的玩家。)

Xuggler很棒,但不幸的是我的水平太低了 – 重新发明轮子的数量(以及更糟糕的轮子)只需要通过寻找工作来回放我就可以了; 我觉得用它解决所有问题需要永远。 对于编码/转码/其他低级video工作虽然我全心全意地推荐它 – 最好毫无疑问。

用我选择的方法注意什么? 好吧,如果外部虚拟机没有明确关闭,即使在应用程序退出后,它们也会在后台继续播放video,并且使用这种方法调试变得更加困难。 我还没有validation它在Mac上运行,我最初的建议可能不是因为我听说过MacOS不会让一个进程控制另一个窗口而没有本机代码的明确许可。 尽管如此,这应该是可能的。

作为我正在研究的项目的一部分,我现在可能会看到我是否可以在一个使用VLCJ的简单Javavideo框架中完成所有这些流程外function。 如果有人对此感兴趣(除了我得到的兴趣越多,我就越有可能做出承诺,我就越有可能继续努力),请随时告诉我!

所以在我的研究和调查结果之后,如果你只是想要播放/录制/流式传输video内容,我建议你选择VLCJ(但绝对使用过程中的播放器),如果你想用Xuggler做任何低级video工作编解码器本身。 在撰写本文时,没有一个好的,纯粹的Java解决方案,它可能会保持一段时间 – 幸运的是,虽然有可能通过本地库交叉平台获得不错的结果。 它只需要更多的工作!

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

您是否尝试过使用JavaFX API?

我认为它的方式JavaFX包括对H.264播放的支持……这里有人展示如何在Google的新开源WebM / VP8中播放video

http://javafxplace.blogspot.com/2010/06/javafx-and-webm-on-linux.html

试试Xuggler ,它用Java包装着名的FFmpeg库。

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

另外,如果我没记错的话,有一个GStreamer的商业插件支持DVD播放,并附带了CSS许可证。 如果这对您的用例无关紧要,您也可以随时使用开源软件(我唯一需要的)。

我同意远离JMF。 特别是如果你想播放DVD。 甚至JMF也依赖于本机代码来实现其某些function。 无论如何,你无论如何都无法摆脱某种原生的依赖。 另一种选择是FMJ。 它是JMF的开源版本。 虽然我没有太多运气。

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

另外,我的另一篇文章可能对你很感兴趣。 链接

此外, 这可能是有用的。

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

 XuggleVideo and XuggleAudio class 

我建议你使用它并实现自己的线程机制来播放它们。 我目前正在制作一个媒体播放器,希望能够很好地播放“热门”video格式

 VideoDisplay class 

在图书馆做了一个很好的工作,但播放有点不稳定,图书馆实施时考虑到摆动并附加

 ImageComponent 

到了一个swing节点似乎在JavaFx中出于某种原因没有用,但我现在可以从显示的video中获取它们,我希望我能得到一些运气。