如何从 C# 中的图像目录创建视频?

Posted

技术标签:

【中文标题】如何从 C# 中的图像目录创建视频?【英文标题】:How can I create a video from a directory of images in C#? 【发布时间】:2010-09-20 01:41:30 【问题描述】:

我有一个包含所有相同维度的位图的目录。我想将这些位图转换成视频文件。我不在乎视频文件(编解码器)是 wmv 还是 avi。我唯一的要求是我指定帧速率。这不需要是跨平台的,仅适用于 Windows(Vista 和 XP)。我已经阅读了一些关于使用 Windows Media SDK 或 DirectShow 的内容,但没有一篇关于提供代码示例的明确说明。

谁能提供一些见解或一些有价值的资源来帮助我在 C# 中做到这一点?

【问题讨论】:

【参考方案1】:

冒着被否决的风险,我将提供一个可能的替代选项——缓冲位图动画。

double framesPerSecond;
Bitmap[] imagesToDisplay;     // add the desired bitmaps to this array
Timer playbackTimer;

int currentImageIndex;
PictureBox displayArea;

(...)

currentImageIndex = 0;
playbackTimer.Interval = 1000 / framesPerSecond;
playbackTimer.AutoReset = true;
playbackTimer.Elapsed += new ElapsedEventHandler(playbackNextFrame);
playbackTimer.Start();

(...)

void playbackNextFrame(object sender, ElapsedEventArgs e)

    if (currentImageIndex + 1 >= imagesToDisplay.Length)
    
            playbackTimer.Stop();

            return;
    

    displayArea.Image = imagesToDisplay[currentImageIndex++];

如果观看用户可以访问图像、有足够的资源将图像保存在内存中、不想等待视频编码并且可能需要不同的播放方式,那么这种方法就很有效速度。

...只是把它扔在那里。

【讨论】:

【参考方案2】:

您可以使用Splicer 来执行此操作。

请参阅http://www.codeplex.com/splicer/Wiki/View.aspx?title=News%20Feeds&referringTitle=Home的示例 3

编辑:

using (ITimeline timeline = new DefaultTimeline(25))

    IGroup group = timeline.AddVideoGroup(32, 160, 100);

    ITrack videoTrack = group.AddTrack();
    IClip clip1 = videoTrack.AddImage("image1.jpg", 0, 2);
    IClip clip2 = videoTrack.AddImage("image2.jpg", 0, 2);
    IClip clip3 = videoTrack.AddImage("image3.jpg", 0, 2);
    IClip clip4 = videoTrack.AddImage("image4.jpg", 0, 2);

    double halfDuration = 0.5;

    group.AddTransition(clip2.Offset - halfDuration, halfDuration, StandardTransitions.CreateFade(), true);
    group.AddTransition(clip2.Offset, halfDuration, StandardTransitions.CreateFade(), false);

    group.AddTransition(clip3.Offset - halfDuration, halfDuration, StandardTransitions.CreateFade(), true);
    group.AddTransition(clip3.Offset, halfDuration, StandardTransitions.CreateFade(), false);

    group.AddTransition(clip4.Offset - halfDuration, halfDuration, StandardTransitions.CreateFade(), true);
    group.AddTransition(clip4.Offset, halfDuration, StandardTransitions.CreateFade(), false);

    ITrack audioTrack = timeline.AddAudioGroup().AddTrack();

    IClip audio =
        audioTrack.AddAudio("soundtrack.wav", 0, videoTrack.Duration);

    audioTrack.AddEffect(0, audio.Duration,
                        StandardEffects.CreateAudioEnvelope(1.0, 1.0, 1.0, audio.Duration));

    using (
        WindowsMediaRenderer renderer =
            new WindowsMediaRenderer(timeline, "output.wmv", WindowsMediaProfiles.HighQualityVideo))
    
        renderer.Render();
    

【讨论】:

【参考方案3】:

您可以使用 avifil32 库中的 AVI*,这里有一个示例(未尝试):http://www.adp-gmbh.ch/csharp/mandelbrot/index.html

您可能对此感兴趣:http://bytescout.com/swfslideshowscout_example_c_sharp.html (使用 C# 从 JPG 图像制作 Flash 幻灯片)

【讨论】:

【参考方案4】:

FFMPEG can easily do this.

【讨论】:

任何使用 FFMPEG 和 .NET C# 的完整源代码示例应用程序?【参考方案5】:

实现您想要的理想技术是DirectShow Editing Services。但是,如果这是一个一次性项目,那么我不会打扰 - 学习曲线可能非常陡峭。

虽然在 MSDN 内外都有大量通用的 DirectShow 示例,但可用的 DES 示例代码的方式并不多。出于您的目的,我建议您从 here 开始,了解使用静止图像作为视频源的基本说明。

【讨论】:

【参考方案6】:

我没试过,但是Windows Movie Maker有一个API,你可以使用XML文件格式。

【讨论】:

以上是关于如何从 C# 中的图像目录创建视频?的主要内容,如果未能解决你的问题,请参考以下文章

如何从Android中的图像数组创建视频?

如何从使用directx c# visual studio播放的视频中获取和处理每一帧(位图图像​​)

如何在 Windows phone silverlight 应用程序上从 C# 填充视频

FFmpeg 示例代码,用于从静止图像 JNI Android 创建视频文件

在 Python 中为 OpenCV 视频对象指定压缩质量

如何使用 php 从图像创建视频?