以编程方式将视频转换为 FLV [关闭]
Posted
技术标签:
【中文标题】以编程方式将视频转换为 FLV [关闭]【英文标题】:Programmatically convert a video to FLV [closed] 【发布时间】:2010-10-04 21:40:48 【问题描述】:我目前正在开发一个网络应用程序,该应用程序需要接受用户以任何格式(.avi、.mov 等)上传的视频并将它们转换为 flv 以便在基于 Flash 的播放器中播放。
由于该站点是基于 OpenCms 的,最好的解决方案是为 OpenCms 准备一个现成的插件,允许在后台上传和播放视频并进行转码操作,但只需一组 Java 类来进行转码即可太好了,然后我可以自己制作上传表单和播放部分。
【问题讨论】:
【参考方案1】:有一个很棒的开源工具叫FFmpeg,我用它来转码我的视频。我使用 php 进行 shell 调用来让它变得生动,但我无法想象让它与 Java 一起玩会太难了。 (Maybe this could be a good starting point for you.)
我每周为我的装置提供 30 多个演出批次,而且它总是以优质材料的形式出现。对我来说唯一棘手的部分是编译它以处理各种视频格式。从好的方面来说,这为我提供了我需要的繁重工作。
【讨论】:
我知道 FFMpeg,但我不确定我是否可以在我的网络服务器上进行 shell 调用(特别是因为我不知道它运行的操作系统,我希望我的应用程序是独立于操作系统),我希望找到纯 java 的东西 不幸的是,FFMpeg 是游戏中唯一免费的真实玩家。 FFmpeg 常用在 linux 上,但如果你愿意,还有一个 Windows 二进制文件。 确保获取/编译支持 LAME 的二进制文件,因为 FLV 通常使用 MP3 作为其音频流 FFMPeg is the 方法...正如有人在另一个答案中提到的那样,您可以使用 java 包装器。【参考方案2】:您可以使用 Xuggler 在 Java 中编码视频,这是一个 Java API,在后台使用 FFmpeg 的 C 代码。
【讨论】:
+1 和更多人为您的答案投票,这些都被低估了。艺术,为您在 Xuggler 项目中的工作大赞。 Xuggler 不是纯 java 可执行文件 - 您需要在操作系统上安装它。这意味着如果我想在 android 中使用它 - 我不能。【参考方案3】:如果您想托管、转码和流式传输 flv 文件(并且不想购买视频转码应用程序),您基本上有两种选择:您可以调用 FFMpeg/MEncoder 或使用外部 Web 服务。您还可以通过允许他们在您的网站上嵌入 YouTube 视频来完全回避这个问题。
如果您选择“本地 FFMpeg 路线”,我建议您简单地使用 ProcessBuilder 并构建一个命令行来执行 FFMpeg。这样您就可以完全控制执行的内容,避免使用 JNI,这绝对是一场噩梦,并且您可以将特定于操作系统的代码排除在您的应用程序之外。您可以找到适用于几乎任何平台的所有花里胡哨的 FFMPeg。很有可能它已经在您的服务器上。
“本地 FFMPeg”路线的好处是您不必为任何额外的托管付费,一切都在本地运行,尽管如果您使用大量磁盘,您的托管管理员可能会开始抱怨和 CPU。还有一些其他 *** 问题讨论了一些 gotchas using FFMpeg 以创建您可以在 Flash 播放器中实际播放的 flv。
Web 服务路由很好,因为涉及的设置较少。我没有使用过Hey!Watch,但它看起来很有希望。 PandaStream 易于设置且运行良好,而且您可以在 S3 上轻松获取所有视频。
【讨论】:
如果您在共享主机环境中运行,CPU 使用率绝对是您必须注意的事情。大多数计划提供充足的磁盘空间和带宽,但对您使用的 CPU 能力非常吝啬。【参考方案4】:这可能有点切题,但我发现Panda Stream 是解决各种视频编码问题的非常有用的解决方案。
您所要做的就是将视频文件上传到运行 Panda 的 Amazon EC2 实例,它会将视频编码为您想要的格式和质量,并在完成后向您的应用程序服务器发出回调并提供详细信息。然后,您可以使用捆绑的 Flash 视频播放器或您自己的播放器来播放您网站上的视频。
与滚动您自己的解决方案相比,这是一个非常可扩展(感谢 Amazon EC2 和 S3)、经济高效且可定制的解决方案。
强烈推荐。
更新:
Panda 的架构如下:
(来源:pandastream.com)
-
页面在 iframe 或弹出窗口中显示 Panda 的上传表单
使用 AJAX 进度条上传视频
编码完成时的API回调
视频流式传输给用户
【讨论】:
【参考方案5】:有一个open source library used by MPlayer,叫做mencoder,它支持FLV,以及很多其他的编解码器。
有一个Java GUI你可以看到是如何制作的
This could help 也是。
我似乎无法找到从控制台调用的任何示例 not,因此它可能对您没有用处。 :S
编辑 也可以看看this question。
【讨论】:
【参考方案6】:您可以尝试使用HeyWatch 等在线服务来转换您的视频。从未使用过,但他们声称
"透明上传,发送视频 从您的网站透明地显示”
不是 Java 解决方案,但您不必担心您的 Web 应用程序在什么操作系统上。
如果操作系统不是问题,我同意theBadDawg 给出的答案。我不知道也没有任何运气找到纯 Java 解决方案。
【讨论】:
【参考方案7】:将一种格式的文件编码为另一种格式需要大量的开发时间才能正确完成,这就是为什么能够完成这些壮举的解码器/编码器如此之少的原因。众所周知和使用最多的是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 建议的在线转换网站。
【讨论】:
【参考方案8】:在视频转码方面,FFMpeg 是最好的。
您可以为 ffmpeg 使用 java 包装器 - http://fmj-sf.net/ffmpeg-java/getting_started.php http://sourceforge.net/projects/jffmpeg/
【讨论】:
【参考方案9】:如果你想用 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")
你就完成了!
【讨论】:
【参考方案10】:您可能还想知道我们现在也将 Panda 作为托管服务发布,这使得设置和扩展更容易:)
http://pandastream.com
【讨论】:
【参考方案11】:是的,ffmpeg 是这项工作的最佳选择......我们使用 ffmpeg 转换视频很长一段时间,它适用于所有视频格式......有很多选项......
【讨论】:
以上是关于以编程方式将视频转换为 FLV [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何将flv视频格式转换为mp4视频格式?只需几步即可免费完成!