2008-10-30 5 views
14

Ich habe ein Verzeichnis von Bitmaps, die alle die gleiche Dimension haben. Ich möchte diese Bitmaps in eine Videodatei konvertieren. Es ist mir egal, ob die Videodatei (Codec) wmv oder avi ist. Meine einzige Voraussetzung ist, dass ich die Bildrate festlege. Dies muss nicht plattformübergreifend sein, nur Windows (Vista und XP). Ich habe ein paar Dinge über die Verwendung des Windows Media SDK oder DirectShow gelesen, aber keine davon ist so explizit in Bezug auf die Bereitstellung von Codebeispielen.Wie kann ich ein Video aus einem Verzeichnis von Bildern in C# erstellen?

Könnte jemand Einblick oder wertvolle Ressourcen geben, die mir dabei helfen könnten, dies in C# zu tun?

Antwort

11

Auf das Risiko der Ablehnung, biete ich eine mögliche alternative Option - eine gepufferte Bitmap-Animation.

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

Ein Ansatz, wie dies funktioniert gut, wenn der Betrachtungs Benutzer Zugriff auf die Bilder, genügend Ressourcen hat die Bilder im Speicher zu halten, will nicht warten, für ein Video, zu kodieren, und es kann eine existieren Notwendigkeit für verschiedene Wiedergabegeschwindigkeiten.

... einfach da rauswerfen.

1

Ich habe es nicht versucht, aber Windows Movie Maker hat eine API und XML-Dateiformat, das Sie verwenden können.

2

Eine ideale Technologie zu erreichen, was Sie ist DirectShow Editing Services wollen. Wenn dies jedoch ein einmaliges Projekt ist, würde ich nicht stören - die Lernkurve kann ziemlich steil sein.

Es ist nicht viel in der Art von DES-Beispielcodes verfügbar, obwohl es viele allgemeine DirectShow-Beispiele sowohl innerhalb als auch außerhalb von MSDN gibt. Für Ihre Zwecke würde ich empfehlen, mit here eine grundlegende Erklärung der Verwendung von Standbildern als Videoquelle zu beginnen.

5

Sie können dazu Splicer verwenden.

Bitte siehe Beispiel 3 bei http://www.codeplex.com/splicer/Wiki/View.aspx?title=News%20Feeds&referringTitle=Home

Edit:

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(); 
    } 
} 
Verwandte Themen