以编程方式将视频转换为FLV [关闭]

问题描述 投票:19回答:11

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

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

java video flv opencms transcode
11个回答
11
投票

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

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

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

Web服务路由很好,因为涉及的设置较少。我没有使用过Hey!Watch,但看起来很有希望。 PandaStream易于设置且运行良好,而且您无需额外的努力就可以在S3上获取所有视频。


0
投票

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

qazxswpoi


0
投票

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


21
投票

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

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


20
投票

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


4
投票

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

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

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

强烈推荐。

更新:

熊猫的架构如下:

pandastream.com (来源:open source library used by MPlayer

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

3
投票

有一个mencoder,称为Java GUI,它支持FLV,以及许多其他编解码器。

有一个This could help你可以看到如何制作

this question也是。

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

编辑还看看HeyWatch


1
投票

您可以尝试使用像theBadDawg这样的在线服务来转换您的视频。从未使用它,但他们声称

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

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

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


1
投票

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

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

FFMpeg确实有一个Java包装器:FOBS,还有jFFmpeg,它有一个JNI可用于围绕ffmpeg的C ++包装器。最后一个我找到http://fmj-sf.net/ffmpeg-java/getting_started.php,但是我发现有一些帖子,我发现该项目可能不再存在。

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


1
投票

1
投票

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

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

文档在这里: // 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://blog.xuggle.com/2009/06/05/introduction-to-xuggler-mediatools/

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

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

相关的示例java代码是:

(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)))

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

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

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

现在你所要做的就是:

http://pandastream.com

你完成了!

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.