Skip to content

An example of how to stream images to FFMPEG stdin to avoid storing them all on disk first

Notifications You must be signed in to change notification settings

TomasHubelbauer/ffmpeg-stream-input-image-set

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 

Repository files navigation

FFMPEG Stream Input Image Set

WEB

This C# script is helpful when you use FFMPEG on Windows (cannot use glob) and need to generate a video from a series of image files which are not named with sequential numbering component.

You can run this script using dotnet script script.csx:

using System.Threading;

var processStartInfo = new ProcessStartInfo();
processStartInfo.FileName = "ffmpeg.exe";
processStartInfo.Arguments = "-y -f image2pipe -i - -vf scale=320:-1 streamed-scaled.jpg";
// Note that this starts a separate process
processStartInfo.UseShellExecute = false;
processStartInfo.RedirectStandardInput = true;
var process = Process.Start(processStartInfo);
// Load the file for streaming into the process
var bytes = File.ReadAllBytes("img.jpg");
await process.StandardInput.BaseStream.WriteAsync(bytes, 0, bytes.Length);

To stream in multiple files and generate a video: (Includes extra settings for iPhone compatibility)

// https://www.nuget.org/packages/System.Drawing.Common
#r "nuget: System.Drawing.Common, 4.5.1"

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Threading;

var processStartInfo = new ProcessStartInfo();
processStartInfo.FileName = "ffmpeg.exe";
processStartInfo.Arguments = "-y -f image2pipe -i - -profile:v baseline -level 3.0 streamed-generated-iphone-small.mp4";
// Note that this starts a separate process
processStartInfo.UseShellExecute = false;
processStartInfo.RedirectStandardInput = true;
var process = Process.Start(processStartInfo);

using (var memoryStream = new MemoryStream())
{
  using (var bitmap = new Bitmap(1280, 720))
  {
    using (var fontFamily = new FontFamily("Arial"))
    {
      using (var font = new Font(fontFamily, 120))
      {
        using (var graphics = Graphics.FromImage(bitmap))
        {
          for (var index = 0; index < 500; index++)
          {
            graphics.Clear(Color.White);
            graphics.SmoothingMode = SmoothingMode.AntiAlias;
            graphics.DrawEllipse(Pens.Black, 10, 10, 500, 500);
            graphics.DrawString("TEST " + index.ToString(), font, Brushes.Black, 50, 50);
            graphics.Save();
            bitmap.Save(memoryStream, ImageFormat.Jpeg);
            var bytes = memoryStream.ToArray();
            memoryStream.Seek(0, SeekOrigin.Begin);
            await process.StandardInput.BaseStream.WriteAsync(bytes, 0, bytes.Length);
          }
        }
      }
    }
  }
}

To-Do

About

An example of how to stream images to FFMPEG stdin to avoid storing them all on disk first

Topics

Resources

Stars

Watchers

Forks