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

时间:2011-01-12 13:38:24

标签: java api video media-player

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

当前选项:

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

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

7 个答案:

答案 0 :(得分:11)

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

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

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

作为我正在研究的项目的一部分我现在可能会看到我是否可以在一个使用VLCJ的简单Java视频框架中完成所有这些流程外功能。如果有人对此感兴趣(我不能保证除了我得到的更多兴趣,我就越有可能继续工作)然后随时让我知道!

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

另外,我的另一篇文章可能对您感兴趣。 Link

此外,this可能有用。

答案 3 :(得分:1)

您是否尝试过使用JavaFX API?

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

我当前正在使用OpenImaj库http://openimaj.org/tutorial,其中有一个

XuggleVideo and XuggleAudio class

我建议您使用它并实现自己的线程机制来播放它们。我目前正在开发一种媒体播放器,希望自从

以来,它能够很好地播放“流行”视频格式
VideoDisplay class

在库中做得很好,但播放有点断断续续,库的实现考虑到了摆动并附加了

ImageComponent 

由于JavaFx中的某种原因,到摆动节点似乎不起作用,但是我现在可以从显示的视频中获取图像,我希望我对此感到幸运。