FFMpegCore 5.1.0
dotnet add package FFMpegCore --version 5.1.0
NuGet\Install-Package FFMpegCore -Version 5.1.0
<PackageReference Include="FFMpegCore" Version="5.1.0" />
paket add FFMpegCore --version 5.1.0
#r "nuget: FFMpegCore, 5.1.0"
// Install FFMpegCore as a Cake Addin #addin nuget:?package=FFMpegCore&version=5.1.0 // Install FFMpegCore as a Cake Tool #tool nuget:?package=FFMpegCore&version=5.1.0
FFMpegCore
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.Bitmap
s as IVideoFrame
s, 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 | Versions 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. |
.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. |
-
.NETStandard 2.0
- Instances (>= 3.0.0)
- System.Text.Json (>= 7.0.2)
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 |
|
StaticSharp.Core
Package Description |
|
FFMpegCore.Extensions.System.Drawing.Common
Image extension for FFMpegCore using System.Common.Drawing |
|
FFMpegCore.Extensions.SkiaSharp
Image extension for FFMpegCore using SkiaSharp |
GitHub repositories (14)
Showing the top 5 popular GitHub repositories that depend on FFMpegCore:
Repository | Stars |
---|---|
yaobiao131/downkyicore
哔哩下载姬(跨平台版)downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等)。
|
|
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
|
|
dorisoy/Dorisoy.Pan
Dorisoy.Pan 是基于.net core8 的跨平台文档管理系统,使用 MS SQL 2012 / MySql8.0(或更高版本)后端数据库,您可以在 Windows、Linux 或 Mac 上运行它,项目中的所有方法都是异步的,支持令牌基身份验证,项目体系结构遵循著名的软件模式和最佳安全实践。源代码是完全可定制的,热插拔且清晰的体系结构,使开发定制功能和遵循任何业务需求变得容易。 系统使用最新的 Microsoft 技术,高性能稳定性和安全性
|
Version | Downloads | Last updated |
---|---|---|
5.1.0 | 1,096,894 | 3/15/2023 |
5.0.2 | 83,406 | 2/21/2023 |
5.0.1 | 4,197 | 2/16/2023 |
5.0.0 | 36,333 | 2/4/2023 |
4.8.0 | 339,103 | 4/15/2022 |
4.7.0 | 122,792 | 1/8/2022 |
4.6.0 | 108,020 | 11/1/2021 |
4.5.0 | 46,428 | 8/12/2021 |
4.4.0 | 20,630 | 7/15/2021 |
4.3.0 | 35,211 | 6/8/2021 |
4.2.0 | 16,568 | 5/14/2021 |
4.1.0 | 47,767 | 3/15/2021 |
4.0.0 | 13,527 | 3/6/2021 |
3.4.0 | 6,911 | 2/3/2021 |
3.3.0 | 7,756 | 12/19/2020 |
3.2.4 | 35,786 | 12/9/2020 |
3.2.3 | 1,514 | 12/9/2020 |
3.2.2 | 1,618 | 12/7/2020 |
3.2.1 | 1,663 | 12/5/2020 |
3.2.0 | 8,211 | 11/25/2020 |
3.1.0 | 12,536 | 10/28/2020 |
3.0.0 | 6,486 | 10/24/2020 |
2.2.6 | 19,282 | 8/10/2020 |
2.2.5 | 4,247 | 8/8/2020 |
2.2.4 | 2,867 | 7/26/2020 |
2.2.3 | 1,674 | 7/25/2020 |
2.2.2 | 3,488 | 7/13/2020 |
2.2.1 | 7,553 | 6/23/2020 |
2.2.0 | 1,993 | 6/20/2020 |
2.1.1 | 1,547 | 6/19/2020 |
2.1.0 | 1,613 | 6/18/2020 |
2.0.1 | 3,615 | 6/6/2020 |
2.0.0 | 1,989 | 5/24/2020 |
1.4.0 | 3,905 | 5/6/2020 |
1.3.3 | 3,394 | 4/15/2020 |
1.3.2 | 1,621 | 4/14/2020 |
1.3.1 | 7,503 | 3/1/2020 |
1.3.0 | 1,554 | 3/1/2020 |
1.2.0 | 1,621 | 2/25/2020 |
1.1.0 | 1,701 | 2/21/2020 |
1.0.12 | 3,939 | 1/29/2020 |
1.0.11 | 15,658 | 9/30/2019 |
1.0.10 | 8,405 | 5/20/2019 |
1.0.9 | 1,738 | 5/11/2019 |
1.0.8 | 4,089 | 5/3/2019 |
1.0.7 | 6,013 | 4/1/2019 |
1.0.6 | 3,570 | 3/27/2019 |
1.0.5 | 5,983 | 3/4/2019 |
1.0.4 | 3,837 | 3/2/2019 |
1.0.2 | 3,669 | 2/26/2019 |
1.0.1 | 3,837 | 2/26/2019 |
1.0.0 | 7,074 | 2/8/2019 |