用 Java 处理视频(DVD、.avi .mkv)
Posted
技术标签:
【中文标题】用 Java 处理视频(DVD、.avi .mkv)【英文标题】:Dealing with video (DVDs, .avi .mkv) in Java 【发布时间】:2011-06-07 20:24:26 【问题描述】:在寻找了一个不错的用 Java 播放视频的库之后,我陷入了困境。周围的每个人都在尖叫不要使用 JMF,因为它已经过时、陈旧并且需要用户安装它,其他替代品(例如 VLCJ)如果它们工作起来似乎不错,但仍然相对不稳定并且依赖大量的本机代码,以及处理DVD,似乎可以在免费图书馆中找到金粉!
当前选项:
现在 JavaFX 2 正在获得动力,这是我一直在认真研究的东西(因此我的问题是 here),但到目前为止,我还没有成功地试图弄清楚如何让它发挥比沼泽标准更多的功能FLV 视频。 VLCJ 的工作正常(请参阅我当前的答案),目前是我正在做的事情。它使用 libvlc 来做几乎任何事情,因为它可以播放几乎任何文件,也可以播放开箱即用的 DVD。最大的问题是您必须为每个播放器使用多个虚拟机才能使其稳定运行,这意味着响应相对较慢。我还没有在 Mac 上使用这种方法。 JMF 非常过时,太可怕了,就我而言,这不是一个真正的选择。以前玩过,体验不是很好! FMJ 说它是 JMF 的替代品。我还没有让它发挥作用,就像我与之交谈过的大多数其他人一样,这本身就让我厌倦了它的质量和理解力,即使我确实设法让它发挥作用! Xuggler 非常适合它的功能,它有很棒的教程,而且写得很好。但是,虽然它非常适合低级转码工作,但播放视频并以正确的顺序和同步的帧等等只是正常工作的噩梦,并且再次添加更多代码,这意味着更多的维护,可能会有更多的错误等等等等…… 我还没有尝试过 GStreamer-Java,尽管它似乎不支持 DVD 播放(它是我正在开发的开源应用程序,因此也不能选择商业插件)而且它是编解码器支持似乎不是最广泛的。 JCodec 是一项有趣的工作,是我见过的唯一一个从纯 Java 角度实现视频支持的工作 - 但目前缺乏对格式的支持,而且它是一个相对较新的项目。 我自己在不同的本地库中为我想要支持的每个平台编写一些东西。由于需要额外的维护和编码时间,因此这是绝对不得已的选择。基于上述(或您能想到的任何其他内容),人们会推荐哪些选项,还有其他我错过的明智选项吗?或者任何其他人认为可能在不久的将来可用?
【问题讨论】:
Xuggler 非常棒,只要其中一个已发布版本适用于您,并且您不期待任何修复或更新。它现在几乎是 DIY。 @Mondain 对于较低级别的转码工作非常有用,但如果您只是想构建一个媒体播放器,则需要大量工作才能使相对简单的功能正常工作(例如搜索)。跨度> 【参考方案1】:在围绕不同的选项进行了大量研究并尝试了一些之后,我毕竟选择了 VLCJ,但这里有一个问题 - 所有 VLCJ 的东西都是在进程外的 VM 中完成的。设置起来有点复杂(请参阅here 了解我是如何做到的),但之后你可以随意使用它,它工作得很好(目前使用 3 个进程外播放器,没有稳定性问题。)
Xuggler 很棒,但不幸的是对我来说水平太低了——为了获得播放和寻找工作所需的大量重新发明***(以及更糟糕的***)让我有些厌烦;我觉得用它来解决所有问题需要很长时间。对于编码/转码/其他低级视频工作,尽管我全心全意地推荐它 - 毫无疑问是最好的。
对我选择的方法有什么注意事项?好吧,如果没有明确关闭外部虚拟机,即使在应用程序退出后,它们也会继续在后台播放视频,并且使用这种方法进行调试变得更加困难。我还没有验证它是否可以在 Mac 上运行,我最初的建议可能不是因为据我所知,MacOS 不会让一个进程在未经本机代码明确许可的情况下控制另一个进程的窗口。不过,这应该可以通过一些工作来实现。
作为我目前正在从事的项目的衍生产品,我可能会看看是否可以将所有这些进程外功能封装在一个简单的 Java 视频框架中,该框架在下面使用 VLCJ。如果有人对此感兴趣(我不能保证,但兴趣越多,我就越有可能致力于此),请随时告诉我!
因此,在我的研究和发现之后,如果您只想播放/录制/流式传输视频内容,我建议您使用 VLCJ(但绝对使用进程外播放器),如果您想使用 Xuggler想用编解码器本身做任何低级视频工作。在撰写本文时,还没有很好的纯 Java 解决方案,而且它可能会保持这种状态一段时间——幸运的是,尽管使用跨平台的原生库可以获得不错的结果。它只是需要更多的工作!
【讨论】:
是的,没错。我已经尝试了所有的库,只有 Xuggler 和 VLCJ 运气好(tnx 推荐 VLCJ,STACK)。我决定使用 VLCJ,因为 Xuggler 没有相机支持。现在我开发的应用程序使用 VLCJ 并同时从 2 个不同的相机和桌面流式传输到 3 个单独的 .flv 文件,并且它可以工作。但是我不使用进程外的..说实话,在你回答我的问题之前没有听说过进程外的播放器。我现在就去看看你的文章。 目前任何最好的推荐,因为这篇文章大约是 5 年前的事了。我希望现在可能有一些图书馆。有吗? @kuhajeyan 唯一真正改变的是在同一 VM 中具有多个 VLCJ 实例的一些错误已得到修复,但 AFAIK 仍然不是全部。据我所知,当然没有其他基于 Java 的库可以提供更好的支持。 @berry120 谢谢,我也终于不得不求助于 vlcj,我最初的意图是让一切都从内部运行,如果 xuggler 仍然活跃的话会感觉很好。很遗憾看到它不再活跃。 我必须使用自定义流来动态解密 mp4 并通过内存缓冲区 (imem) 将数据传递给 vlclib。这太慢了,以至于 mp4 视频在 20-30 秒内启动。每次读取都必须通过 JNI 完成。任何想法如何做到这一点?【参考方案2】:我在我的一些项目中使用了 jffmeg(ffmeg java 绑定),到目前为止我还没有遇到任何问题。 http://jffmpeg.sourceforge.net/documentation.html。我也用过qt-jambi,但没试过它的视频库(phonon),这也可以解决你的问题。
【讨论】:
jffmpeg 不只是 JMF 的编解码器包而不是媒体库吗?【参考方案3】:您是否尝试过使用 JavaFX API?
我认为 JavaFX 包括对 H.264 播放的支持...这里有人展示了如何在 Google 的新开源 WebM / VP8 中播放视频
http://javafxplace.blogspot.com/2010/06/javafx-and-webm-on-linux.html
【讨论】:
我还没有尝试过使用它们,但如果我使用的是 JavaFX,我宁愿等到 2.0 发布并且不推荐使用那个可怕的 JavaFX 脚本。当前版本肯定可以在桌面上使用 JavaFX - 但我看到的所有使用视频的示例都相当老套,并且通常依赖于可能因版本而异的内部结构。【参考方案4】:试试 Xuggler
,它用 Java 封装了著名的 FFmpeg
库。
【讨论】:
Xuggler 看起来很有前途,我目前正在使用它,效果很好。谢谢! FWIW 如果其他人在看这个,Xuggle 现在已经闲置多年了 (xuggle.com/xuggler/status)。【参考方案5】:我可以推荐gstreamer-java 绑定。顾名思义,它将GStreamer API 包装在Java 类中。通过这种方式,您可以访问 GStreamer 提供的媒体处理图形功能。如果您想执行更高级的任务(例如转码),这可能非常简洁。
另外,如果我没记错的话,GStreamer 有一个商业插件,它支持 DVD 播放并附带 CSS 许可证。如果这对您的用例无关紧要,您也可以随时使用开源的(我唯一需要的)。
【讨论】:
gstreamer-java 看起来很有前途,谢谢。我会玩一玩,看看我能做什么!【参考方案6】:我同意远离 JMF。特别是如果您想播放 DVD。甚至 JMF 的某些功能也依赖本机代码。无论如何,您可能不会摆脱某种本机依赖项。另一种选择是FMJ。它是 JMF 的开源版本。不过我还没有运气。
我的建议是选择 VLCJ。当我需要媒体解决方案时,我正在探索这一点。不幸的是,它是在 GPL 下发布的,所以我不能在我的应用程序中使用它,但它似乎应该能够处理你想要的。
另外,您可能会对我的另一篇文章感兴趣。 Link
另外,this 可能有用。
【讨论】:
我过去也尝试过 FMJ,但未能成功,并与其他遇到类似情况的人交谈过!我对 VLCJ 有两种看法——从表面上看,它看起来非常好,它有大量的媒体支持,并且具有适用于多个平台的本机二进制文件。但是我在使用它时遇到的崩溃数量(我的意思是虚拟机井喷,不仅仅是抛出的错误和异常)非常可怕。希望这在未来会有所改善,但对于像我目前正在尝试开发的用户友好的应用程序,不幸的是它排除了它。 我知道,他们为成为替代品而感到自豪……要是这么简单就好了。我从来没有真正开始玩弄 VLCJ,但它如此不稳定肯定会给你带来一些严重的问题。 Java 确实缺乏一个好的最新多媒体解决方案。您可能会发现我的另一篇关于使用 JMF 而无需显式安装它的帖子很有趣。我喜欢上面的。 感谢该链接-实际上我在早些时候搜索时遇到了该答案,解决安装程序问题很好!我根本无法让 VLCJ 可靠地工作。它在最初做任何事情之前一直在崩溃,然后当我设法让它工作时,它总是以看似随机的间隔崩溃。很遗憾,因为如果它“正常工作”,那正是我所需要的!【参考方案7】:我目前正在使用 OpenImaj 库 http://openimaj.org/tutorial,它有一个
XuggleVideo and XuggleAudio class
我建议您使用它并实现自己的线程机制来播放它们。我目前正在开发一个媒体播放器,希望它能够很好地播放“流行”视频格式,因为
VideoDisplay class
在库中做得很好,但是播放有点断断续续,并且库的实现考虑到了摇摆并附加了
ImageComponent
由于某种原因,在 JavaFx 中,swing 节点似乎无法正常工作,但我现在能够从显示的视频中获取它们的图像,我希望我能得到一些运气。
【讨论】:
根据其他一些 cmets,我会厌倦使用任何基于 Xuggle 的东西,因为它已经停用多年了。此外,它是一个相当低级的库,更适合处理单个帧而不是实际的视频播放。以上是关于用 Java 处理视频(DVD、.avi .mkv)的主要内容,如果未能解决你的问题,请参考以下文章