2008-10-30 21 views
14

Tengo un directorio de mapas de bits que son todos de la misma dimensión. Me gustaría convertir estos mapas de bits en un archivo de video. No me importa si el archivo de video (códec) es wmv o avi. Mi único requisito es que especifique la velocidad de fotogramas. No es necesario que sea multiplataforma, solo para Windows (Vista y XP). He leído algunas cosas sobre el uso de Windows Media SDK o DirectShow, pero ninguno de ellos es tan explícito como proporcionar muestras de código.¿Cómo puedo crear un video desde un directorio de imágenes en C#?

¿Alguien podría proporcionar alguna información, o algunos recursos valiosos que podrían ayudarme a hacer esto en C#?

Respuesta

11

A riesgo de ser rechazado, ofreceré una opción alternativa posible: una animación de mapa de bits en búfer.

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

Un enfoque como esto funciona bien si el usuario tiene acceso a la visualización de las imágenes, los recursos suficientes para mantener las imágenes en la memoria, no quieren esperar a que un video para codificar, y puede existir una necesidad de diferentes velocidades de reproducción.

... tirando por ahí.

2

una tecnología ideal para lograr lo que quiere es DirectShow Editing Services. Sin embargo, si se trata de un proyecto único, no me molestaría, la curva de aprendizaje puede ser bastante empinada.

No hay mucho en el camino del código de muestra DES disponible, aunque hay muchos ejemplos generales de DirectShow tanto dentro como fuera de MSDN. Para sus propósitos, recomiendo comenzar here para una explicación básica del uso de imágenes fijas como fuente de video.

5

Puede usar Splicer para hacerlo.

Por favor, véase el ejemplo 3 en http://www.codeplex.com/splicer/Wiki/View.aspx?title=News%20Feeds&referringTitle=Home

Editar:

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(); 
    } 
} 
Cuestiones relacionadas