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

时间:2008-10-30 19:38:35

标签: c# directshow media multimedia wmv

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

任何人都可以提供一些见解,或者一些有价值的资源可以帮助我在C#中做到这一点吗?

6 个答案:

答案 0 :(得分:11)

冒着被投票的风险,我会提供一个可能的替代选项 - 缓冲的位图动画。

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++];
}

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

......把它扔到那里。

答案 1 :(得分:5)

您可以使用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();
    }
}

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

答案 4 :(得分:2)

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

虽然在MSDN内外都有大量的DirectShow示例,但可用的DES示例代码并不多。为了您的目的,我建议您开始here,以获取将静止图像用作视频源的基本说明。

答案 5 :(得分:1)

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