2008-10-30 27 views
14

J'ai un répertoire de bitmaps qui ont tous la même dimension. Je voudrais convertir ces bitmaps en un fichier vidéo. Je me fiche que le fichier vidéo (codec) soit wmv ou avi. Ma seule exigence est que je spécifie le taux de trame. Cela n'a pas besoin d'être multi-plateforme, Windows (Vista et XP) seulement. J'ai lu quelques petites choses sur l'utilisation de Windows Media SDK ou DirectShow, mais aucune d'entre elles n'est aussi explicite sur la fourniture d'exemples de code.Comment puis-je créer une vidéo à partir d'un répertoire d'images en C#?

Est-ce que quelqu'un pourrait fournir un aperçu, ou des ressources précieuses qui pourraient m'aider à le faire en C#?

Répondre

11

Au risque d'être rejeté, j'offrirai une option alternative possible: une animation bitmap mise en mémoire tampon.

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

Une telle approche fonctionne bien si l'utilisateur de visualisation a accès aux images, des ressources suffisantes pour garder les images en mémoire, ne veut pas attendre une vidéo pour coder, et il peut exister une besoin de différentes vitesses de lecture.

... juste jeter là-bas.

1

Je ne l'ai pas essayé, mais Windows Movie Maker a une API et un format de fichier XML que vous pouvez utiliser.

2

Une technologie idéale pour réaliser ce que vous voulez est DirectShow Editing Services. Cependant, s'il s'agit d'un projet ponctuel, je ne m'en soucierai pas - la courbe d'apprentissage peut être assez abrupte.

Il n'y a pas beaucoup de code d'échantillon DES disponible, bien qu'il y ait beaucoup d'exemples généraux de DirectShow à l'intérieur et à l'extérieur de MSDN. Pour vos besoins, je recommande de commencer here pour une explication de base de l'utilisation des images fixes comme source vidéo.

5

Pour ce faire, vous pouvez utiliser Splicer.

S'il vous plaît voir exemple 3 à 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(); 
    } 
}