我需要在Java中实现简单的视频播放。
以下是我的要求。
生产质量
打开和解码视频文件,其视频和音频编解码器可以由我选择。即我可以选择行为良好的编解码器。
能够 扮演, 暂停, 寻找到帧 或 seekToTime 和 阻止 回放。本质上,我希望能够以非线性方式播放单个视频文件的片段。例如,我可能想播放20.3秒到25.6秒的片段,暂停10秒,然后播放340.3秒到350.5秒的片段,等等。
在播放过程中,视频和音频必须是同步的。
视频必须在Swing JComponent中显示。
必须能在商业产品中使用,而不必是开源的(即LGPL或Comercial就好)。
我的研究使我得出以下解决方案。
我已经实现了一个快速的原型,这似乎可以满足我的需求。我可以使用Fobs4JMF播放一段视频。
player.setStopTime(new Time(end));
player.setMediaTime(new Time(start));
player.start();
虽然Fobs4JMF似乎可以工作,但我觉得代码的质量很差,而且这个项目已经不活跃了。有人知道有什么产品使用Fobs4JMF吗?
与Java不同,Flash在播放视频方面很出色。我可以用这些方法写一个小的Flash应用程序。
open(String videoFile),
play(),
pause(),
seek(int duration),
stop()
然后用JFlashPlayer把它带入Java中 它可以从Java中调用Flash函数。
我喜欢这个方案的原因是,Flash中的视频播放应该是坚如磐石的。有人用JFlashPlayer在Java中播放视频吗?
Xuggler是一个Java的FFMpeg包装器,它似乎是一个相当活跃和高质量的项目。然而,实现需求中描述的简单视频播放并不简单(特别是Seeking),但一些工作已经在MediaTools MediaViewer中完成,这将是建立在其基础上的。
我曾试图让FMJ工作,但至今没有成功。
我将感谢您对我的问题的意见。
能否有兄弟为之点赞 Xuggler?
在我看来 VLCJ 是这种类型的事情的前进方向。我喜欢Xuggler的编码转码工作,但不幸的是,要做简单的回放和解决所有的同步问题和类似的问题实在是太复杂了--而且这样做确实很像重新发明轮子。
VLCJ唯一的问题是,为了让它能可靠地与多个播放器一起工作,我不得不求助于进程外的播放器。这个框架并不是世界上最简单的东西,但当它在那里时,它工作得很好。我目前在我的应用中并排运行了3个进程外播放器,没有任何问题。
另一个注意事项是,嵌入式媒体播放器不会与swing组件一起工作,只是一个重量级的画布--但事实证明这对我来说完全不是问题。如果可以,那么你可以使用直接的媒体播放器来获得一个缓冲图像,并将其显示在你所选择的任何东西上,但它会占用你的CPU更多一点(尽管不会比其他采取这种方法的播放器更多)。
JavaFX 有一些工作的视频和音频编解码器的内置。 它可能是目前支持最广泛的解决方案。
我一直在使用jffmpeg,就像你使用FOBS一样,它的工作原理非常好,尽管我还没有比较它们。
我也很想看到一种简单的方式来与本地编解码器接口,就像JavaFX一样,但JavaFX和Java之间似乎并没有真正的整合。
也有一些工作试图把VLC库libvlc放到java中。我还没有尝试过,有兴趣听听谁的反馈。
还没有尝试过Xuggler(我很感兴趣),但我有一个很好的时间。VLCJ. 我发现它的缺点只是你必须在应用之前安装VLC。