Como posso criar um vídeo a partir de um diretório de imagens em C #?
-
05-07-2019 - |
Pergunta
Eu tenho um diretório de bitmaps que são todos da mesma dimensão. Gostaria de converter esses bitmaps em um arquivo de vídeo. Eu não me importo se o arquivo de vídeo (codec) é wmv ou avi. Minha única exigência é que eu especificar a taxa de quadros. Isso não precisa ser multi-plataforma, o Windows (Vista e XP). Eu li algumas coisas sobre como usar o Windows Media SDK ou DirectShow, mas nenhum deles é que explícita sobre o fornecimento de amostras de código.
Alguém poderia fornecer algum insight, ou alguns recursos valiosos que pode me ajudar a fazer isso em C #?
Solução
Com o risco de ser rejeitada, eu vou oferecer uma alternativa possível option-- uma animação Bitmap tamponada.
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++];
}
Uma abordagem como esta funciona bem se o usuário visualiza tem acesso às imagens, recursos suficientes para manter as imagens na memória, não quer esperar por um vídeo para codificar, e pode existir uma necessidade de reprodução diferente velocidades.
... simplesmente jogá-la lá fora.
Outras dicas
Você pode usar Splicer para fazer isso.
Por favor, veja o exemplo 3 em 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();
}
}
Você pode usar o AVI * da biblioteca avifil32, há um exemplo aqui (não tentou):
http://www.adp-gmbh.ch/csharp/mandelbrot/index. html
Esta pode ser interessante para você:
http://bytescout.com/swfslideshowscout_example_c_sharp.html
(Make de flash slideshow de imagens JPG usando C #)
Uma tecnologia ideal para conseguir o que você quer é DirectShow Editing Services . No entanto, se este é um one-off projeto, então eu não me incomodaria -. A curva de aprendizagem pode ser bastante íngreme
Não há muito na forma de código de exemplo DES disponíveis, embora há uma abundância de amostras gerais DirectShow tanto dentro como fora MSDN. Para seus propósitos Eu recomendo começar aqui para uma explicação básica de usar imagens estáticas como uma fonte de vídeo.
Eu não tentei, mas Windows Movie Maker tem uma API, e formato de arquivo XML que você pode usar.