14

すべて同じ次元のビットマップのディレクトリがあります。これらのビットマップをビデオファイルに変換したいと思います。ビデオファイル(コーデック)がwmvであるかaviであるかは関係ありません。私の唯一の要件は、フレームレートを指定することです。これはクロスプラットフォームである必要はなく、Windows(VistaおよびXP)のみです。Windows Media SDKまたはDirectShowの使用についていくつか読んだことがありますが、コードサンプルの提供についてそれほど明確なものはありません。

誰かがC#でこれを行うのに役立つかもしれない洞察や貴重なリソースを提供できますか?

4

6 に答える 6

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

このようなアプローチは、表示ユーザーが画像にアクセスでき、画像をメモリに保持するのに十分なリソースがあり、ビデオがエンコードされるのを待ちたくない場合にうまく機能し、さまざまな再生速度が必要になる場合があります。

...ただそれをそこに投げます。

于 2008-10-30T21:31:16.160 に答える
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();
    }
}
于 2008-11-14T12:17:04.657 に答える
3

avifil32 ライブラリの AVI* を使用できます。ここに例があります (試していません):
http://www.adp-gmbh.ch/csharp/mandelbrot/index.html

これはあなたにとって興味深いかもしれません:
http://bytescout.com/swfslideshowscout_example_c_sharp.html
(C# を使用して JPG 画像からフラッシュ スライドショーを作成します)

于 2008-10-30T20:39:11.740 に答える
2

FFMPEG はこれを簡単に行うことができます。

于 2008-10-31T09:24:35.643 に答える
2

あなたが望むものを実現するための理想的なテクノロジーは、DirectShow Editing Servicesです。ただし、これが 1 回限りのプロジェクトである場合は気にしません。学習曲線は非常に急勾配になる可能性があります。

利用可能な DES サンプル コードはあまりありませんが、MSDN の内外に一般的な DirectShow サンプルがたくさんあります。あなたの目的のために、静止画像をビデオソースとして使用するための基本的な説明をここから始めることをお勧めします.

于 2008-10-31T12:18:47.630 に答える
1

私は試していませんが、Windows ムービー メーカーには API があり、使用できる XML ファイル形式があります。

于 2008-10-31T09:01:42.007 に答える