从 C# 中的图像制作视频的工作方式

Posted

技术标签:

【中文标题】从 C# 中的图像制作视频的工作方式【英文标题】:Working way to make video from images in C# 【发布时间】:2010-10-07 01:23:39 【问题描述】:

有没有人知道从一系列图像文件创建视频的可靠方法?在您因为在发布问题之前不搜索答案而对我进行修改之前,以及在您发出“使用 FFMPEG”之类的简单消息之前,请阅读此消息的其余部分。

我正在尝试从一系列图像(.jpg、.bmp 等)中创建视频,只要得到广泛支持,什么格式并不重要。我的平台是 Windows Server 2008,64 位。如果我可以在我的 C# 程序中制作视频,那就太好了,但我不反对将一系列图像文件写入一个目录,然后启动一个外部程序从这些图像制作视频。

唯一的限制是:它必须在我的 Windows Server 2008 系统上运行,并且可以编写脚本。也就是说,没有需要操作员干预的 GUI 程序。

我在 *** 上发现了许多类似的问题,并尝试了几种解决方案,但都遇到了不同程度的挫败感,没有一个像成功一样。

FFMPEG 看起来是一个很棒的程序。也许是,在 Linux 上。我下载的两个 Windows 版本已损坏。鉴于此命令行:

  ffmpeg -r 1 -f image2 -i jpeg\*.jpg video.avi

其中一个构建读取图像,然后由于数据执行阻止而崩溃。另一个读取第一个文件,然后吐出一条错误消息,上面写着“找不到适合文件 jpeg/image2.jpg 的编解码器”。有帮助,那个。在任何情况下,FFMPEG 在 Windows 下看起来都不是入门者。

推荐Splicer 对先前帖子的一个答案。它看起来很不错的代码。我编译了示例并尝试运行,但收到​​了一些关于未找到文件的神秘错误消息。看起来 COM 类没有注册。我想我需要安装一些东西(也许是 DirectShow,虽然我认为它已经安装了?)。根据需要,我可能很难证明它在服务器上的安装。 (“什么?为什么在服务器上需要它?”)

另一个答案建议来自 Code Project 的 AviFile 库。这看起来很简单:一个围绕 Windows AviFile 子系统的包装器。除了包创建的 AVI 文件似乎包含所有帧,但当我在 Windows Media Player 中播放 AVI 时,只显示第一帧。好吧,如果您尝试创建压缩视频,程序会抛出异常。

所以,我想知道是否有一种好的、可靠的方法来做我想做的事:在 Windows 系统上,通过 .NET API 从一系列图像创建 AVI 或其他常见视频文件格式或使用外部程序。有什么帮助吗?

【问题讨论】:

尝试不带 -f image2 或带 -f jpeg 的 ffmpeg 命令,即 'ffmpeg -r 1 -i jpeg/*.jpg video.avi' 或 'ffmpeg -r 1 -f jpeg - i jpeg/*.jpg video.avi' @configurator:没有 -f image2,我得到相同的结果。使用 -f jpeg,我得到“未知的输入或输出格式:jpeg”。 【参考方案1】:

在使用了一段时间并查看了 x264 和 VideoLan 之后,我又回到了 Splicer。事实证明,神秘的错误消息是由于我的代码中的错误造成的。

看起来 Splicer 会做我想做的事:以编程方式从一系列图像创建视频。

感谢所有回复的人。

【讨论】:

【参考方案2】:

您可以使用 VideoLan,我会推荐它。

我曾在 C# 应用程序中使用 VideoLan 做这两件事的直接经验:

    在我的 C# 应用程序中嵌入 VLC 查看器(VLC 查看器有 3-4 个 C#“包装器”)。 通过向其发送命令行参数,在单独的进程中使用 vlc.exe。

VideoLan 具有命令行界面这一事实是一件好事。 VLC 支持禁用任何视觉元素的命令行选项;所以 VLC GUI 不会弹出,命令行窗口也不会弹出。因此,在 C# 应用程序中,您可以将与视频相关的工作外包给 VLC 客户端。 C# 具有可以为您管理 vlc.exe 实例的 Process 类。它最终成为一个非常简洁的解决方案。

【讨论】:

【参考方案3】:

在 Windows 上处理视频(编码和播放)是一个真正的泥潭。而且 .NET 根本不会帮助您 - 您总是要么成为 PInvoking/COM 互操作的原生 API,要么使用其他人构建的 .NET 包装器来做同样的事情。

无论如何,我不能说我用过它,但一个不错的选择似乎是x264 library that is part of the videolan project。这为您提供了一个独立的 C 库,您可以 PInvoke 并且您不必担心在您的服务器上安装和 DirectShow 垃圾。据我了解,它将生成可在 Flash 中播放的 H.264 格式视频。

【讨论】:

【参考方案4】:

我使用mplayer 的 mencoder 在 linux 上从 TGA 文件创建 AVI(使用编解码器 msmpeg4/mp3,默认情况下可使用 Windows Media Player 读取),如下所示:

mencoder mf://*.tga -mf fps=25:type=tga \
  -audiofile /tmp/test.mp3 -oac copy \
  -of lavf -ovc lavc \          
  -lavcopts vcodec=msmpeg4v2:mbd=2:mv0:trell:cbp:last_pred=3:vbitrate=3000 \
  -o /tmp/test.avi

我知道 mplayer 确实有 Windows 版本。

【讨论】:

【参考方案5】:

您可以将想要包含在视频中的所有图像复制到剪贴板,然后将其导入 Windows Live Movie Maker(当然是动态的!)并编译给你!

所有这些都可以通过代码来完成,但这样一来,您就不必自己创建它。正如您所说的平台是 Windows,并且所有 Windows 组合都安装了 Windows Live Movie Maker,因此除非

a) 他们卸载了 Windows Live Movie Maker

b) 他们正在使用运行 Windows 版本超过 8 或 9 年的计算机...

【讨论】:

@Rugs:并非所有 Windows 计算机都安装了 Windows Live Movie Maker。它当然没有默认安装在 Windows Server 2008 上,许多开发人员将它用于他们的开发机器。其次,如果您有某种自动方式将数千张图像添加到剪贴板并将它们一次导入到 Movie Maker,那么您的解决方案可能会起作用。但大多数情况下,我会拒绝这种解决方案,因为我有一个程序可以动态创建图像并将它们一个接一个地导入到 Movie Maker 中需要非常长的时间。

以上是关于从 C# 中的图像制作视频的工作方式的主要内容,如果未能解决你的问题,请参考以下文章

C# OPC 应用程序代码相同,但工作方式不同

ios视频​​上的Phonertc只能以一种方式工作

如何以编程方式从 YouTube 视频中提取音频? [关闭]

将图像组合成音频文件并以编程方式在android中制作视频文件

SQL Server 中的 NEXT VALUE FOR @Sequence 的工作方式是不是与 C# 中的 Interlocked.Increment() 相同? [复制]

FFmpeg 从放置在不同文件夹中的图像制作视频