FFMpegCore 5.2.0

dotnet add package FFMpegCore --version 5.2.0                
NuGet\Install-Package FFMpegCore -Version 5.2.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="FFMpegCore" Version="5.2.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add FFMpegCore --version 5.2.0                
#r "nuget: FFMpegCore, 5.2.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install FFMpegCore as a Cake Addin
#addin nuget:?package=FFMpegCore&version=5.2.0

// Install FFMpegCore as a Cake Tool
#tool nuget:?package=FFMpegCore&version=5.2.0                

FFMpegCore

NuGet Badge GitHub issues GitHub stars GitHub CI GitHub code contributors

A .NET Standard FFMpeg/FFProbe wrapper for easily integrating media analysis and conversion into your .NET applications. Supports both synchronous and asynchronous calls

API

FFProbe

Use FFProbe to analyze media files:

var mediaInfo = await FFProbe.AnalyseAsync(inputPath);

or

var mediaInfo = FFProbe.Analyse(inputPath);

FFMpeg

Use FFMpeg to convert your media files. Easily build your FFMpeg arguments using the fluent argument builder:

Convert input file to h264/aac scaled to 720p w/ faststart, for web playback

FFMpegArguments
    .FromFileInput(inputPath)
    .OutputToFile(outputPath, false, options => options
        .WithVideoCodec(VideoCodec.LibX264)
        .WithConstantRateFactor(21)
        .WithAudioCodec(AudioCodec.Aac)
        .WithVariableBitrate(4)
        .WithVideoFilters(filterOptions => filterOptions
            .Scale(VideoSize.Hd))
        .WithFastStart())
    .ProcessSynchronously();

Convert to and/or from streams

await FFMpegArguments
    .FromPipeInput(new StreamPipeSource(inputStream))
    .OutputToPipe(new StreamPipeSink(outputStream), options => options
        .WithVideoCodec("vp9")
        .ForceFormat("webm"))
    .ProcessAsynchronously();

Helper methods

The provided helper methods makes it simple to perform common operations.

Easily capture snapshots from a video file:

// process the snapshot in-memory and use the Bitmap directly
var bitmap = FFMpeg.Snapshot(inputPath, new Size(200, 400), TimeSpan.FromMinutes(1));

// or persists the image on the drive
FFMpeg.Snapshot(inputPath, outputPath, new Size(200, 400), TimeSpan.FromMinutes(1));

You can also capture GIF snapshots from a video file:

FFMpeg.GifSnapshot(inputPath, outputPath, new Size(200, 400), TimeSpan.FromSeconds(10));

// or async
await FFMpeg.GifSnapshotAsync(inputPath, outputPath, new Size(200, 400), TimeSpan.FromSeconds(10));

// you can also supply -1 to either one of Width/Height Size properties if you'd like FFMPEG to resize while maintaining the aspect ratio
await FFMpeg.GifSnapshotAsync(inputPath, outputPath, new Size(480, -1), TimeSpan.FromSeconds(10));

Join video parts into one single file:

FFMpeg.Join(@"..\joined_video.mp4",
    @"..\part1.mp4",
    @"..\part2.mp4",
    @"..\part3.mp4"
);

Create a sub video

FFMpeg.SubVideo(inputPath, 
    outputPath,
    TimeSpan.FromSeconds(0),
    TimeSpan.FromSeconds(30)
);

Join images into a video:

FFMpeg.JoinImageSequence(@"..\joined_video.mp4", frameRate: 1,
    ImageInfo.FromPath(@"..\1.png"),
    ImageInfo.FromPath(@"..\2.png"),
    ImageInfo.FromPath(@"..\3.png")
);

Mute the audio of a video file:

FFMpeg.Mute(inputPath, outputPath);

Extract the audio track from a video file:

FFMpeg.ExtractAudio(inputPath, outputPath);

Add or replace the audio track of a video file:

FFMpeg.ReplaceAudio(inputPath, inputAudioPath, outputPath);

Combine an image with audio file, for youtube or similar platforms

FFMpeg.PosterWithAudio(inputPath, inputAudioPath, outputPath);
// or
var image = Image.FromFile(inputImagePath);
image.AddAudio(inputAudioPath, outputPath);

Other available arguments could be found in FFMpegCore.Arguments namespace.

Input piping

With input piping it is possible to write video frames directly from program memory without saving them to jpeg or png and then passing path to input of ffmpeg. This feature also allows for converting video on-the-fly while frames are being generated or received.

An object implementing the IPipeSource interface is used as the source of data. Currently, the IPipeSource interface has two implementations; StreamPipeSource for streams, and RawVideoPipeSource for raw video frames.

Working with raw video frames

Method for generating bitmap frames:

IEnumerable<IVideoFrame> CreateFrames(int count)
{
    for(int i = 0; i < count; i++)
    {
        yield return GetNextFrame(); //method that generates of receives the next frame
    }
}

Then create a RawVideoPipeSource that utilises your video frame source

var videoFramesSource = new RawVideoPipeSource(CreateFrames(64))
{
    FrameRate = 30 //set source frame rate
};
await FFMpegArguments
    .FromPipeInput(videoFramesSource)
    .OutputToFile(outputPath, false, options => options
        .WithVideoCodec(VideoCodec.LibVpx))
    .ProcessAsynchronously();

If you want to use System.Drawing.Bitmaps as IVideoFrames, a BitmapVideoFrameWrapper wrapper class is provided.

Binaries

Installation

If you prefer to manually download them, visit ffbinaries or zeranoe Windows builds.

Windows (using choco)

command: choco install ffmpeg -y

location: C:\ProgramData\chocolatey\lib\ffmpeg\tools\ffmpeg\bin

Mac OSX

command: brew install ffmpeg mono-libgdiplus

location: /usr/local/bin

Ubuntu

command: sudo apt-get install -y ffmpeg libgdiplus

location: /usr/bin

Path Configuration

Option 1

The default value of an empty string (expecting ffmpeg to be found through PATH) can be overwritten via the FFOptions class:

// setting global options
GlobalFFOptions.Configure(new FFOptions { BinaryFolder = "./bin", TemporaryFilesFolder = "/tmp" });

// or
GlobalFFOptions.Configure(options => options.BinaryFolder = "./bin");

// on some systems the absolute path may be required, in which case 
GlobalFFOptions.Configure(new FFOptions { BinaryFolder = Server.MapPath("./bin"), TemporaryFilesFolder = Server.MapPath("/tmp") });

// or individual, per-run options
await FFMpegArguments
    .FromFileInput(inputPath)
    .OutputToFile(outputPath)
    .ProcessAsynchronously(true, new FFOptions { BinaryFolder = "./bin", TemporaryFilesFolder = "/tmp" });

// or combined, setting global defaults and adapting per-run options
GlobalFFOptions.Configure(new FFOptions { BinaryFolder = "./bin", TemporaryFilesFolder = "./globalTmp", WorkingDirectory = "./" });

await FFMpegArguments
    .FromFileInput(inputPath)
    .OutputToFile(outputPath)
    .Configure(options => options.WorkingDirectory = "./CurrentRunWorkingDir")
    .Configure(options => options.TemporaryFilesFolder = "./CurrentRunTmpFolder")
    .ProcessAsynchronously();

Option 2

The root and temp directory for the ffmpeg binaries can be configured via the ffmpeg.config.json file, which will be read on first use only.

{
  "BinaryFolder": "./bin",
  "TemporaryFilesFolder": "/tmp"
}

Supporting both 32 and 64 bit processes

If you wish to support multiple client processor architectures, you can do so by creating two folders, x64 and x86, in the BinaryFolder directory. Both folders should contain the binaries (ffmpeg.exe and ffprobe.exe) built for the respective architectures.

By doing so, the library will attempt to use either /{BinaryFolder}/{ARCH}/(ffmpeg|ffprobe).exe.

If these folders are not defined, it will try to find the binaries in /{BinaryFolder}/(ffmpeg|ffprobe.exe).

(.exe is only appended on Windows)

Compatibility

Older versions of ffmpeg might not support all ffmpeg arguments available through this library. The library has been tested with version 3.3 to 4.2

Code contributors

<a href="https://github.com/rosenbjerg/ffmpegcore/graphs/contributors"> <img src="https://contrib.rocks/image?repo=rosenbjerg/ffmpegcore" /> </a>

Other contributors

<a href="https://github.com/tiesont"><img src="https://avatars3.githubusercontent.com/u/420293?v=4" title="tiesont" width="80" height="80"></a>

License

Copyright © 2023

Released under MIT license

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (20)

Showing the top 5 NuGet packages that depend on FFMpegCore:

Package Downloads
SIL.Media

SIL.Media contains Windows Forms UI elements and classes for processing audio on Windows and Linux.

Fsel.Core

Fsel Core Package

FFMpegCore.Extensions.System.Drawing.Common

Image extension for FFMpegCore using System.Common.Drawing

StaticSharp.Core

Package Description

FFMpegCore.Extensions.SkiaSharp

Image extension for FFMpegCore using SkiaSharp

GitHub repositories (15)

Showing the top 5 popular GitHub repositories that depend on FFMpegCore:

Repository Stars
yaobiao131/downkyicore
哔哩下载姬(跨平台版)downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等)。
Squidex/squidex
Headless CMS and Content Managment Hub
PixiEditor/PixiEditor
PixiEditor is a pixel art editor made with .NET 8
xiaoyaocz/biliuwp-lite
哔哩哔哩UWP Lite
swharden/Csharp-Data-Visualization
Resources for visualizing data using C# and the .NET platform
Version Downloads Last updated
5.2.0 4,353 3/5/2025
5.1.0 1,376,008 3/15/2023
5.0.2 85,439 2/21/2023
5.0.1 4,212 2/16/2023
5.0.0 42,130 2/4/2023
4.8.0 354,069 4/15/2022
4.7.0 126,815 1/8/2022
4.6.0 109,290 11/1/2021
4.5.0 46,582 8/12/2021
4.4.0 20,746 7/15/2021
4.3.0 35,860 6/8/2021
4.2.0 17,137 5/14/2021
4.1.0 51,099 3/15/2021
4.0.0 13,582 3/6/2021
3.4.0 6,980 2/3/2021
3.3.0 7,960 12/19/2020
3.2.4 36,618 12/9/2020
3.2.3 1,527 12/9/2020
3.2.2 1,630 12/7/2020
3.2.1 1,678 12/5/2020
3.2.0 8,257 11/25/2020
3.1.0 13,218 10/28/2020
3.0.0 6,555 10/24/2020
2.2.6 19,430 8/10/2020
2.2.5 4,260 8/8/2020
2.2.4 2,884 7/26/2020
2.2.3 1,687 7/25/2020
2.2.2 3,517 7/13/2020
2.2.1 7,613 6/23/2020
2.2.0 2,006 6/20/2020
2.1.1 1,561 6/19/2020
2.1.0 1,627 6/18/2020
2.0.1 3,632 6/6/2020
2.0.0 2,008 5/24/2020
1.4.0 3,936 5/6/2020
1.3.3 3,496 4/15/2020
1.3.2 1,637 4/14/2020
1.3.1 7,612 3/1/2020
1.3.0 1,568 3/1/2020
1.2.0 1,638 2/25/2020
1.1.0 1,718 2/21/2020
1.0.12 4,090 1/29/2020
1.0.11 15,675 9/30/2019
1.0.10 8,438 5/20/2019
1.0.9 1,757 5/11/2019
1.0.8 4,445 5/3/2019
1.0.7 6,041 4/1/2019
1.0.6 3,596 3/27/2019
1.0.5 6,082 3/4/2019
1.0.4 3,866 3/2/2019
1.0.2 3,687 2/26/2019
1.0.1 3,858 2/26/2019
1.0.0 7,737 2/8/2019

- **Instances and Packages Updates**: Updates to various instances and packages by rosenbjerg.
- **Audio and Video Enhancements**: Additions include a Copy option to Audio Codec and a Crop option to Arguments by brett-baker; video-stream level added to FFProbe analysis by Kaaybi; AV1 support for smaller snapshots and videos by BenediktBertsch; multiple input files support by AddyMills; HDR color properties support added to FFProbe analysis by Tomiscout.
- **System.Text.Json Bump**: Update by Kaaybi.
- **FFMpeg Processors and Utilities**: Modification for handling durations over 24 hours in `FFMpegArgumentProcessor` by alahane-techtel; fix for snapshots with correct width/height from rotated videos by Hagfjall.
- **Feature Additions and Fixes**: Support for multiple outputs and tee muxer by duggaraju; custom ffprob arguments by vfrz; fix for null reference exception with tags container by rosenbjerg; Chapter Modell change by vortex852456; codec copy added to the SaveM3U8Stream method by rpaschoal.
- **Closed and Non-merged Contributions**: Notable closed contributions include JSON source generators usage by onionware-github; Snapshot overload by 3UR; FromRawInput method by pedoc; runtime ffmpeg suite installation by yuqian5; and support for scale_npp by vicwilliam.
- **Miscellaneous Fixes**: Minor readme corrections by NaBian; fix for ffmpeg path issue by devedse.