以编程方式将视频转换为FLV

时间:2009-02-02 10:17:13

标签: java video flv opencms transcode

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

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

11 个答案:

答案 0 :(得分:21)

我使用了一个很棒的开源工具调用FFmpeg来转码我的视频。我使用PHP进行shell调用以使其变得生动,但我无法想象让它与Java玩得很好是太难了。 (Maybe this could be a good starting point for you.)

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

答案 1 :(得分:20)

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

答案 2 :(得分:11)

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

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

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

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

答案 3 :(得分:4)

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

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

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

强烈推荐。

<强>更新

熊猫的架构如下:

Architecture of Panda Stream
(来源:pandastream.com

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

答案 4 :(得分:3)

open source library used by MPlayer,称为mencoder,它支持FLV,以及许多其他编解码器。

你可以看到Java GUI是如何制作的

This could help

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

修改的 另请查看this question

答案 5 :(得分:1)

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

  

“透明上传,发送视频   透明地从您的网站“

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

如果操作系统不是问题,我同意theBadDawg给出的答案。我不知道并且没有找到纯粹的java解决方案。

答案 6 :(得分:1)

将文件以一种格式编码到另一种格式需要花费大量的开发时间才能做到正确,这就是解码器/编码器能够完成这些功能的原因。众所周知和使用最多的是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,但是我发现Google上有一些帖子表明该项目可能不再存在。

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

答案 7 :(得分:1)

FFMpeg在视频转码方面是最好的。

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

答案 8 :(得分:1)

如果你想用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")

你已经完成了!

答案 9 :(得分:0)

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

http://pandastream.com

答案 10 :(得分:0)

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