以编程方式将video转换为FLV

我目前正在开发一个Web应用程序,需要接受用户以任何格式(.avi,.mov等)上传的video,并将它们转换为flv,以便在基于flash的播放器中播放。

由于该站点是基于OpenCms的,因此最好的解决方案是OpenCms的现成插件,允许在后台上传和播放转码操作的video,但只需要一组Java类来进行转码就可以了。我可以自己制作上传表格和播放部分。

如果您想要托管,转码和流式传输flv文件(并且不想购买video转码应用程序),您基本上有两种选择:您可以调用FFMpeg / MEncoder,也可以使用外部Web服务。 您还可以通过允许他们在您的网站上嵌入YouTubevideo来完全回避问题。

如果你去’本地FFMpeg路线’,我建议只使用ProcessBuilder并构建一个命令行来执行FFMpeg。 通过这种方式,您可以完全控制执行的内容,避免使用JNI,这是一个绝对的噩梦,并且您可以将特定于操作系统的代码保留在应用程序之外。 几乎任何平台都可以找到FFMPeg的所有铃声和口哨声。 它很可能已经存在于您的服务器上。

关于“本地FFMPeg”路线的好处是,您不必为任何额外的托管付费,并且一切都在本地运行,尽管您的托管管理员可能会开始抱怨如果您使用了大量的磁盘和CPU。 还有一些其他的StackOverflow问题讨论了一些使用FFMpeg创建可以在Flash播放器中实际播放的flv的陷阱 。

Web服务路由很好,因为涉及的设置较少。 我没有使用嘿!看,但看起来很有希望。 PandaStream易于设置且运行良好,而且您无需额外工作即可在S3上获取所有video。

有一个很棒的开源工具调用FFmpeg ,我用它来转码我的video。 我使用PHP进行shell调用以使其变得生动,但我无法想象让它与Java玩得很好是太难了。 (也许这对你来说可能是一个很好的起点。)

我每周为我的装置提供超过30个批次的批次,它总是作为优质材料出售。 对我来说唯一棘手的部分是编译它来处理各种各样的video格式。 从好的方面来说,这为我提供了繁重的工作。

您可以使用Xuggler对Java中的video进行编码, Xuggler是一个Java API,它本身在幕后使用FFmpeg的C代码。

这可能会略微相切,但我发现Panda Stream是解决各种video编码问题的非常有用的解决方案。

您所要做的就是将video文件上传到运行Panda的Amazon EC2实例,它会将video编码为您想要的格式和质量,并在完成后向您的应用服务器发送回调。 然后,您可以使用捆绑的Flashvideo播放器或您自己的播放器播放您网站上的video。

与滚动自己的解决方案相比,它具有极高的可扩展性(多亏了Amazon EC2和S3),具有成本效益和可定制的解决方案。

强烈推荐。

更新:

pandas的架构如下:

pandas流建筑http://sofzh.miximages.com/java/panda_arch.gif

  1. 页面在iframe或弹出窗口中显示Panda的上传表单
  2. 使用AJAX进度条上传video
  3. 编码完成后的API回调
  4. video流式传输给用户

MPlayer使用的开源库名为mencoder ,它支持FLV,以及许多其他编解码器。

有一个Java GUI,你可以看到它是如何制作的

这也有帮助 。

我似乎无法找到任何从控制台调用的示例,因此它可能对您没有用。 :S

编辑也看看这个问题 。

您可以尝试使用HeyWatch等在线服务转换video。 从未使用它,但他们声称

“透明上传,透明地从您的网站发送video”

不是Java解决方案,但您不必担心Web应用程序所使用的操作系统。

如果OS不是问题,我同意BadDawg给出的答案。 我不知道并且没有找到纯Java解决方案的运气。

将文件以一种格式编码到另一种格式需要花费大量的开发时间才能正确完成,这就是解码器/编码器能够完成这些function的原因。 众所周知和使用最多的是ffmpeg和mencoder。

您可能想要了解的是查看您运行的平台(Windows / Mac OS X /其他unix)是否具有可以使用的基本API调用集,这些调用能够解码文件并重新编码它们。 Windows有DirectShow,Mac OS X有Quicktime。 不确定您是否可以使用Java访问这些API。

FFMpeg确实有一个Java包装器: FFMPEG Java ,还有一个FOBS ,它有一个JNI可用于围绕ffmpeg的C ++包装器。 最后一个我发现了jFFmpeg ,但是我发现有一些post与谷歌建议该项目可能不再存在。

你最好的选择是来自mplayer和/或ffmpeg的mencoder。 Ffmpeg可以作为单独的二进制文件安装,然后使用默认的“shell”命令从其他代码调用。 但是,如果您无法执行命令,则可能需要使用Mark Robinson建议的在线转换网站。

FFMpeg是video转码的最佳选择。

您可以为ffmpeg使用java包装器 – http://fmj-sf.net/ffmpeg-java/getting_started.php http://sourceforge.net/projects/jffmpeg/

如果你想用java做,你可以使用Xuggle轻松完成。

他们有一个很棒的网站,解释如何做所有事情

文档在这里: http : //build.xuggle.com/view/Stable/job/xuggler_jdk5_stable/javadoc/java/api/index.html

以及一个很好的教程,告诉你如何做你想做的事情:http://blog.xuggle.com/2009/06/05/introduction-to-xuggler-mediatools/

它们提供了一种简单的方法,可以在第一个教程中执行您想要的操作,即简单的转码。

我发现它可以正常编码到flv。 它在幕后的作用是使用ffmpeg,所以任何绊倒ffmpeg的东西也会因xuggle而失败。

相关的示例java代码是:

// create a media reader IMediaReader reader = ToolFactory.makeReader("videofile.flv"); // add a viewer to the reader, to see the decoded media reader.addListener(ToolFactory.makeWriter("output.mov", reader)); // read and decode packets from the source file and // and dispatch decoded audio and video to the writer while (reader.readPacket() == null) ; 

我从http://wiki.xuggle.com/MediaTool_Introduction得到了

如果你想要一些完全正常工作的clojure代码…这里是:)

 (import '(com.xuggle.mediatool ToolFactory)) (import '(com.xuggle.mediatool IMediaDebugListener IMediaDebugListener$Event)) (defn readerRecurse "calls .readPacket until there's nothing left to do2" [reader] (if (not (nil? (.readPacket reader))) ; here .readPacket actually does the processing as a side-effect. true ; it returns null when it has MORE ro process, and signals an error when done... (recur reader))) (defn convert "takes video and converts it to a new type of video" [videoInput videoOutput] (let [reader (ToolFactory/makeReader videoInput)] (doto reader (.addListener (ToolFactory/makeWriter videoOutput reader)) (.addListener (ToolFactory/makeDebugListener (into-array [IMediaDebugListener$Event/META_DATA])))) (readerRecurse reader))) 

现在你所要做的就是:

 (convert "/path/to/some_file.stupid_extention" "/path/to/awesome.flv") 

你完成了!

您可能也有兴趣听说我们现在已经将Panda作为托管服务发布,这使得设置和扩展更容易:)

http://pandastream.com

是的,ffmpeg是这项工作的最佳选择…我们使用ffmpeg长时间转换video,它适用于所有video格式..有很多选项…

    Interesting Posts