15166a1501
chore: configure travis |
||
---|---|---|
.build | ||
.nuget | ||
FFMpegCore | ||
FFMpegCore.Test | ||
.gitattributes | ||
.gitignore | ||
.travis.yml | ||
FFMpegCore.sln | ||
LICENSE | ||
pack.ps1 | ||
README.md |
FFMpegCore
Setup
NuGet:
Install-Package FFMpegCore
A great way to use FFMpeg encoding when writing video applications, client-side and server-side. It has wrapper methods that allow conversion to all web formats: MP4, OGV, TS and methods of capturing screens from the videos.
Configuration
By default the RootDirectory
is set to "\\FFMPEG\\bin"
.
Option 1
The default value can be overwritten via the FFMpegOptions
class:
public Startup()
{
FFMpegOptions.Configure(new FFMpegOptions { RootDirectory = "\\My_Binary\\Path" });
}
Option 2
The root directory for the ffmpeg binaries can be configured via the ffmpeg.config.json
file.
{
"RootDirectory": ".//FFMPEG//bin"
}
The files that need to be included can be found here: https://github.com/vladjerca/FFMpegCore/tree/master/FFMpegCore/FFMPEG/bin
I can only guarantee an expected behaviour built binaries included, other 3rd party builds could contain API changes rendering an unexpected behaviour.
MacOSX The Unit test have run on MacOSX - 10.14.4 using ffmpeg version 4.1.3. (It was installed using "brew install ffmpeg" and "brew install mono-libgdiplus"). The RootDirectory was set to "/usr/local/bin" for running unit test.
Ubuntu 16.04 The unit test failed on 2 test when running against default ffmpeg package of (ffmpeg version 2.8.15-0ubuntu0.16.04.1) The two test that failed were Video_ToMP4_Args and Video_ToMP4_Resize_Args The Unit test passed when running against ffmpeg version 4.1.3
FFProbe
FFProbe is used to gather video information
static void Main(string[] args)
{
string inputFile = "G:\\input.mp4";
// loaded from configuration
var video = new VideoInfo(inputFile);
string output = video.ToString();
Console.WriteLine(output);
}
Sample output:
Video Path : G:\input.mp4
Video Root : G:\\
Video Name: input.mp4
Video Extension : .mp4
Video Duration : 00:00:09
Audio Format : none
Video Format : h264
Aspect Ratio : 16:9
Framerate : 30fps
Resolution : 1280x720
Size : 2.88 Mb
FFMpeg
Convert your video files to web ready formats:
static void Main(string[] args)
{
string inputFile = "input_path_goes_here";
var encoder = new FFMpeg();
FileInfo outputFile = new FileInfo("output_path_goes_here");
var video = VideoInfo.FromPath(inputFile);
// easily track conversion progress
encoder.OnProgress += (percentage) => Console.WriteLine("Progress {0}%", percentage);
// MP4 conversion
encoder.Convert(
video,
outputFile,
VideoType.Mp4,
Speed.UltraFast,
VideoSize.Original,
AudioQuality.Hd,
true
);
// OGV conversion
encoder.Convert(
video,
outputFile,
VideoType.Ogv,
Speed.UltraFast,
VideoSize.Original,
AudioQuality.Hd,
true
);
// TS conversion
encoder.Convert(
video,
outputFile,
VideoType.Ts
);
}
Easily capture screens from your videos:
static void Main(string[] args)
{
string inputFile = "input_path_goes_here";
FileInfo output = new FileInfo("output_path_goes_here");
var video = VideoInfo.FromPath(inputFile);
new FFMpeg()
.Snapshot(
video,
output,
new Size(200, 400),
TimeSpan.FromMinutes(1)
);
}
Join video parts:
static void Main(string[] args)
{
FFMpeg encoder = new FFMpeg();
encoder.Join(
new FileInfo(@"..\joined_video.mp4"),
VideoInfo.FromPath(@"..\part1.mp4"),
VideoInfo.FromPath(@"..\part2.mp4"),
VideoInfo.FromPath(@"..\part3.mp4")
);
}
Join image sequences:
static void Main(string[] args)
{
FFMpeg encoder = new FFMpeg();
encoder.JoinImageSequence(
new FileInfo(@"..\joined_video.mp4"),
1, // FPS
ImageInfo.FromPath(@"..\1.png"),
ImageInfo.FromPath(@"..\2.png"),
ImageInfo.FromPath(@"..\3.png")
);
}
Strip audio track from videos:
static void Main(string[] args)
{
string inputFile = "input_path_goes_here",
outputFile = "output_path_goes_here";
new FFMpeg()
.Mute(
VideoInfo.FromPath(inputFile),
new FileInfo(outputFile)
);
}
Save audio track from video:
static void Main(string[] args)
{
string inputVideoFile = "input_path_goes_here",
outputAudioFile = "output_path_goes_here";
new FFMpeg()
.ExtractAudio(
VideoInfo.FromPath(inputVideoFile),
new FileInfo(outputAudioFile)
);
}
Add audio track to video:
static void Main(string[] args)
{
string inputVideoFile = "input_path_goes_here",
inputAudioFile = "input_path_goes_here",
outputVideoFile = "output_path_goes_here";
FFMpeg encoder = new FFMpeg();
new FFMpeg()
.ReplaceAudio(
VideoInfo.FromPath(inputVideoFile),
new FileInfo(inputAudioFile),
new FileInfo(outputVideoFile)
);
}
Add poster image to audio file (good for youtube videos):
static void Main(string[] args)
{
string inputImageFile = "input_path_goes_here",
inputAudioFile = "input_path_goes_here",
outputVideoFile = "output_path_goes_here";
FFMpeg encoder = new FFMpeg();
((Bitmap)Image.FromFile(inputImageFile))
.AddAudio(
new FileInfo(inputAudioFile),
new FileInfo(outputVideoFile)
);
/* OR */
new FFMpeg()
.PosterWithAudio(
inputImageFile,
new FileInfo(inputAudioFile),
new FileInfo(outputVideoFile)
);
}
Control over the 'FFmpeg' process doing the job:
static void Main(string[] args)
{
string inputVideoFile = "input_path_goes_here",
outputVideoFile = "input_path_goes_here";
FFMpeg encoder = new FFMpeg();
// start the conversion process
Task.Run(() => {
encoder.Convert(new VideoInfo(inputVideoFile), new FileInfo(outputVideoFile));
});
// stop encoding after 2 seconds (only for example purposes)
Thread.Sleep(2000);
encoder.Stop();
}
Enums
Video Size enumeration:
public enum VideoSize
{
HD,
FullHD,
ED,
LD,
Original
}
Speed enumeration:
public enum Speed
{
VerySlow,
Slower,
Slow,
Medium,
Fast,
Faster,
VeryFast,
SuperFast,
UltraFast
}
Audio codecs enumeration:
public enum AudioCodec
{
Aac,
LibVorbis
}
Audio quality presets enumeration:
public enum AudioQuality
{
Ultra = 384,
Hd = 192,
Normal = 128,
Low = 64
}
Video codecs enumeration:
public enum VideoCodec
{
LibX264,
LibVpx,
LibTheora,
Png,
MpegTs
}
ArgumentBuilder
Custom video converting presets could be created with help of ArgumentsContainer
class:
var container = new ArgumentsContainer();
container.Add(new VideoCodecArgument(VideoCodec.LibX264));
container.Add(new ScaleArgument(VideoSize.Hd));
var ffmpeg = new FFMpeg();
var result = ffmpeg.Convert(container, new FileInfo("input.mp4"), new FileInfo("output.mp4"));
Other availible arguments could be found in FFMpegCore.FFMPEG.Arguments
namespace.
If you need to create your custom argument, you just need to create new class, that is inherited from Argument
, Argument<T>
or Argument<T1, T2>
For example:
public class OverrideArgument : Argument
{
public override string GetStringValue()
{
return "-y";
}
}
Contributors
License
Copyright © 2018, Vlad Jerca. Released under the MIT license.