19

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

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

4

11 回答 11

21

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

我每周为我的装置提供 30 多个演出批次,而且它总是以优质材料的形式出现。对我来说唯一棘手的部分是编译它以处理各种视频格式。从好的方面来说,这为我提供了我需要的繁重工作。

于 2009-02-02T10:32:32.580 回答
20

您可以使用Xuggler在 Java 中编码视频,这是一个 Java API,在后台使用 FFmpeg 的 C 代码。

于 2009-12-11T22:39:26.080 回答
11

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

如果您选择“本地 FFMpeg 路线”,我建议您简单地使用 ProcessBuilder 并构建一个命令行来执行 FFMpeg。这样您就可以完全控制执行的内容,避免使用 JNI,这绝对是一场噩梦,并且您可以将特定于操作系统的代码排除在应用程序之外。您可以找到适用于几乎任何平台的所有花里胡哨的 FFMPeg。它很有可能已经在您的服务器上。

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

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

于 2009-02-25T16:55:02.633 回答
4

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

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

与滚动您自己的解决方案相比,它是一个非常可扩展(感谢 Amazon EC2 和 S3)、经济高效且可定制的解决方案。

强烈推荐。

更新:

Panda的架构如下:

熊猫流的架构
(来源:pandastream.com

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

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

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

这也有帮助

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

编辑 也看看这个问题

于 2009-02-24T11:32:06.117 回答
1

您可以尝试使用HeyWatch 之类的在线服务来转换您的视频。从未使用过,但他们声称

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

不是 java 解决方案,但您不必担心您的 Web 应用程序在什么操作系统上。

如果操作系统不是问题,我同意theBadDawg给出的答案。我不知道也没有运气找到一个纯 Java 解决方案。

于 2009-02-20T16:27:14.443 回答
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 建议的在线转换网站进行查看。

于 2009-02-23T10:34:56.480 回答
1

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

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

于 2009-02-24T10:58:43.093 回答
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")

你就完成了!

于 2010-04-09T04:43:23.430 回答
0

您可能还想知道我们现在也将 Panda 作为托管服务发布,这使得设置和扩展更容易:)

http://pandastream.com

于 2010-04-26T15:44:20.640 回答
0

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

于 2010-09-16T09:25:12.877 回答