FFmpeg4Sharp 1.0.2
There is a newer version of this package available.
See the version list below for details.
See the version list below for details.
dotnet add package FFmpeg4Sharp --version 1.0.2
NuGet\Install-Package FFmpeg4Sharp -Version 1.0.2
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="FFmpeg4Sharp" Version="1.0.2" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add FFmpeg4Sharp --version 1.0.2
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: FFmpeg4Sharp, 1.0.2"
#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 FFmpeg4Sharp as a Cake Addin #addin nuget:?package=FFmpeg4Sharp&version=1.0.2 // Install FFmpeg4Sharp as a Cake Tool #tool nuget:?package=FFmpeg4Sharp&version=1.0.2
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
FFmpeg4Sharp
A FFmpeg.AutoGen Warpper Library.
This's NOT a ffmpeg command-line library.
NOTE: FFmpeg's APIs are unstable.
Must use the corresponding version of the ffmpeg's dll file.
This branch is under construction, or use old version
"NuGet\Install-Package EmguFFmpeg".
Usage
Manually download the *.dll files that comply with the license from ffmpeg.org.
using FFmpeg.AutoGen;
using FFmpeg4Sharp;
///////////// Create a mp4 file ///////////
var fps = 29.97d;
var width = 800;
var heith = 600;
var outputFile = "path-to-your-output-file.mp4";
using (var muxer = MediaMuxer.Create(outputFile))
{
using (var vEncoder = MediaEncoder.CreateVideoEncoder(muxer.Format, width, heith, fps))
{
var vStream = muxer.AddStream(vEncoder);
muxer.WriteHeader();
using (var vFrame = MediaFrame.CreateVideoFrame(width, heith, vEncoder.PixFmt))
{
for (var i = 0; i < 30; i++)
{
// your code to fill YUV AVFrame data,
// default is green frame.
// you can use PixelConverter: RGB AVFrame->YUV AVFrame
//FillYuv420P(vFrame, i);
vFrame.Pts = i;
foreach (var packet in vEncoder.EncodeFrame(vFrame))
{
packet.StreamIndex = vStream.Index;
muxer.WritePacket(packet, vEncoder.TimeBase);
}
}
}
muxer.FlushCodecs(new[] { vEncoder });
muxer.WriteTrailer();
}
}
//////////// Video to images ///////////
var input = "path-to-your-input-file.mp4";
using (var mediaReader = MediaDemuxer.Open(input))
using (var srcPacket = new MediaPacket())
using (var srcFrame = new MediaFrame())
using (var convert = new PixelConverter())
{
var decoders = mediaReader.Select(_ => MediaDecoder.CreateDecoder(_.CodecparRef)).ToList(); // create decoder for each AVStream
MediaFrame dstFrame = null;
foreach (var inPacket in mediaReader.ReadPackets(srcPacket))
{
var decoder = decoders[inPacket.StreamIndex];
if (decoder != null)
{
dstFrame = dstFrame == null
? MediaFrame.CreateVideoFrame(decoder.Width, decoder.Height, FFmpeg.AutoGen.AVPixelFormat.AV_PIX_FMT_BGR24)
: dstFrame;
foreach (var inFrame in decoder.DecodePacket(inPacket, srcFrame))
{
if (decoder.CodecType == FFmpeg.AutoGen.AVMediaType.AVMEDIA_TYPE_VIDEO) // Only Video AVStream
{
foreach (var outFrame in convert.Convert(inFrame, dstFrame)) // Convert to rgb frame(mp4 frame is yuv frame)
{
using (var bitmap = new Bitmap(outFrame.Width, outFrame.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb))
{
var bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, bitmap.PixelFormat);
var srcLineSize = outFrame.Linesize[0];
var dstLineSize = bitmapData.Stride;
FFmpegUtil.CopyPlane((IntPtr)outFrame.Ref.data[0], srcLineSize,
bitmapData.Scan0, bitmapData.Stride, Math.Min(srcLineSize, dstLineSize), bitmap.Height); // rgb frame to bitmap
bitmap.UnlockBits(bitmapData);
bitmap.Save(Path.Combine(output, $"{mediaReader[inPacket.StreamIndex].ToTimeSpan(inPacket.Pts).TotalMilliseconds}ms.jpg"));
}
}
}
}
}
}
dstFrame?.Dispose();
decoders.ForEach(_ => _?.Dispose()); // Dispose all decoder
}
More see example/FFmpegSharp.Example
ROADMAP
- Easy api to cut/seek/mute audio clip.
- Easy api to cut/seek video clip.
- More example and test.
- Provides a queue for multiplexing/demultiplexing and encoding/decoding.
- Data exchange with NAudio and SharpAVI.
- Subtitle support.
- Split the filter section into optional standalone nuget packages.
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 is compatible. |
.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.
-
.NETStandard 2.0
- FFmpeg.AutoGen (>= 5.1.1)
-
.NETStandard 2.1
- FFmpeg.AutoGen (>= 5.1.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories (1)
Showing the top 1 popular GitHub repositories that depend on FFmpeg4Sharp:
Repository | Stars |
---|---|
b-editor/beutl
Cross-platform video editing (compositing) software.
|