Мне нужно создать видео, которое в основном представляет собой слайд-шоу, созданное из изображений. Я использую для этого ffmpeg. Кроме того, это видео должно содержать звуковую дорожку.
Я не хочу создавать временные файлы, но хочу полностью работать в памяти. Итак, я использую поток instaed:
public void AddImages()
{
int framerate = 1;
Process ffmpeg = new Process
{
StartInfo = new ProcessStartInfo(FfMpegPath, $"-f image2pipe -framerate {framerate} -i pipe:.jpg -c:v libx264 -b:v 1M -vf scale=640:-1 -y D:\\output.mp4")
{
UseShellExecute = false,
RedirectStandardInput = true,
RedirectStandardOutput = true
}
};
ffmpeg.Start();
var position = new TimeSpan();
while (position < _image.CurrentEpisode.Duration)
{
var imageFile = _image.CreateImageForTime(position);
using (var imageStream=new MemoryStream())
{
imageFile.Save(imageStream, ImageFormat.Jpeg);
imageStream.WriteTo(ffmpeg.StandardInput.BaseStream);
}
position = position.Add(TimeSpan.FromSeconds(1));
}
// Add Audio
GetAudioStream().WriteTo(ffmpeg.StandardInput.BaseStream);
ffmpeg.StandardInput.BaseStream.Flush();
ffmpeg.StandardInput.BaseStream.Close();
ffmpeg.WaitForExit();
}
Все работает нормально, пока не появится часть «Добавить аудио». Таким образом создается видео, содержащее изображения. Я понимаю, что вставить звук не удается, потому что ffmpeg вместо этого ожидает изображение.
Так есть ли способ сообщить ffmpeg, что следующий элемент inputstream-item больше не изображение, а аудиофайл?
(imageFile содержит действительный Bitmap, а GetAudioStream - действительный поток MemoryStream, созданный из файла mp3)