Skip to main content

Video conversion

Use Avalonia.HeadlessTestingFramework.Recording and configure Skia rendering before recording. Run capture operations on the Avalonia UI thread.

The VideoConverter converts PNG sequences to video files using FFmpeg.

Basic Usage​

var converter = new VideoConverter();

// Check FFmpeg availability
if (converter.IsFfmpegAvailable())
{
Console.WriteLine($"FFmpeg version: {converter.GetFfmpegVersion()}");

// Convert PNG sequence to video
var result = converter.ConvertPngSequenceToVideo(
inputDirectory: "/path/to/frames",
outputPath: "/path/to/output.mp4",
options: new VideoConversionOptions
{
Format = VideoFormat.Mp4,
FrameRate = 30,
Quality = 23
});

if (result.Success)
{
Console.WriteLine($"Video created: {result.OutputPath}");
Console.WriteLine($"Frames processed: {result.FrameCount}");
Console.WriteLine($"Duration: {result.Duration}");
}
else
{
Console.WriteLine($"Error: {result.ErrorMessage}");
}
}

Video Formats​

FormatCodecDescription
Mp4H.264Most compatible, good quality
WebMVP9Web-optimized, open format
GifGIFAnimated GIF (limited colors)
AviMJPEGLegacy format

Conversion Options​

var options = new VideoConversionOptions
{
Format = VideoFormat.Mp4,
FrameRate = 30, // Output frame rate
Quality = 23, // H.264 CRF (0-51, lower = better)
Scale = 1.0, // Output scale (0.5 = half size)
OverwriteExisting = true,
DeleteSourceFiles = false, // Keep PNG files after conversion
Timeout = TimeSpan.FromMinutes(5),
LoopCount = 0, // GIF loop count (0 = infinite)
FfmpegPath = null, // Custom FFmpeg path (null = auto-detect)
CustomArguments = null // Additional FFmpeg arguments
};

Async Conversion​

var result = await converter.ConvertPngSequenceToVideoAsync(
inputDirectory: "/path/to/frames",
options: options,
cancellationToken: cts.Token);

Convert Multiple Directories​

var results = await converter.ConvertMultipleAsync(
directories: new[] { "/dir1", "/dir2", "/dir3" },
options: options);

foreach (var (dir, result) in results)
{
Console.WriteLine($"{dir}: {(result.Success ? "Success" : result.ErrorMessage)}");
}

Extension Methods​

// Convert a recording session directly
var session = recorder.CurrentSession;
var result = await session.ToVideoAsync(
outputPath: "/output.mp4",
options: new VideoConversionOptions { Format = VideoFormat.Mp4 });

// Synchronous version
var result = session.ToVideo();