Conversions snippets are extensions of Conversion class with snippets. Most simple conversions will be done with built-in templates or with little modification. That was designed to simplify typical conversions and teach how to create own solutions.
FFmpeg.Conversions.FromSnippet is a good point to start using Xabe.FFmpeg library. Every method may be used as template for a more conversions. If you think that your new conversion method is really useful, do not hesitate about include them to Xabe.FFmpeg.FFmpeg.Conversions.FromSnippet by pull request.
Every method is only a snippet and uses only IConversion with specific configuration. See the source to know how chosen conversion works.
The easiest way to concatenate video files is by FFmpeg.Conversions.FromSnippet.Concatenate:
string output = Path.ChangeExtension(Path.GetTempFileName(), ".mp4");
var conversion = await FFmpeg.Conversions.FromSnippet.Concatenate(output, Resources.MkvWithAudio, Resources.Mp4WithAudio);
await conversion.Start();
Concatenation works with almost unlimited number of files.
Concatenate snippet is one of the most complicated logic in whole library. Providing one generic method to join a lot of file types required few sacrifices. One of them is speed. Concatenation if done by filter_complex concat and all of input videos are scaled to the one with highest resolution. A few other options are set too like aspect, format or anullsrc.
FFmpeg allows to create gif file from video. Number of loops (one to infinity) and delay between repeats can be specified in parameters. The easiest way to get gif from video is to use FFmpeg.Conversions.FromSnippet.ToGif() method.
string output = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + ".gif");
IConversion conversion = await FFmpeg.Conversions.FromSnippet.ToGif(Resources.Mp4, output, 1, 1);
IConversionResult result = await conversion.Start();
/// <summary>
/// Convert image video stream to gif
/// </summary>
/// <param name="inputPath">Input path</param>
/// <param name="outputPath">Output path</param>
/// <param name="loop">Number of repeats</param>
/// <param name="delay">Delay between repeats (in seconds)</param>
/// <returns>Conversion result</returns>
IConversion ToGif(string inputPath, string outputPath, int loop, int delay = 0);
The simplest way to get snapshot is by FFmpeg.Conversions.FromSnippet.Snapshot:
string output = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + ".png");
IConversion conversion = await FFmpeg.Conversions.FromSnippet.Snapshot(Resources.Mp4WithAudio, output, TimeSpan.FromSeconds(0));
IConversionResult result = await conversion.Start();
Conversion returns snapshot in format specified in output path so outputPath should be with correct extension. Image has exactly the same size as a video.
Example of use watermarks:
string output = Path.ChangeExtension(Path.GetTempFileName(), ".mp4");
IConversion conversion = await FFmpeg.Conversions.FromSnippet.SetWatermark(Resources.Mp4WithAudio, output, Resources.PngSample, Position.Center);
IConversionResult result = await conversion.Start();
Watermark can be set in different position in a video:
/// <summary>
/// Melt watermark into video
/// </summary>
/// <param name="inputPath">Input video path</param>
/// <param name="outputPath">Output file</param>
/// <param name="inputImage">Watermark</param>
/// <param name="position">Position of watermark</param>
/// <returns>Conversion result</returns>
Task<IConversion> SetWatermark(string inputPath, string outputPath, string inputImage, Position position);
Big Buck Bunny with melted watermark in the center
The simplest way to add audio to video file is by AddAudio method. It works for most cases. By default it takes first video stream from input video file and first audio stream from input audio file and all subtitles from video file. It can work unpredictable when you will try to change format/extension of input file.
string output = Path.ChangeExtension(Path.GetTempFileName(), ".mp4");
var conversion = await FFmpeg.Conversions.FromSnippet.AddAudio(Resources.Mp4, Resources.Mp3, output);
IConversionResult result = await conversion
.Start();
If you think video streams are redundant or you have multiple audio streams and you need only default one you can use ExtractAudio snippet. It creates new file with only one audio stream:
string output = Path.ChangeExtension(Path.GetTempFileName(), "mp3");
var conversion = FFmpeg.Conversions.FromSnippet.ExtractAudio(Resources.Mp4WithAudio, output);
await conversion.Start();
Sometimes you needs end user attention but it is hard with audio file. VisualiseAudio adds generated visualisation like in an old music players:
string output = Path.ChangeExtension(Path.GetTempFileName(), "mp4");
var conversion = await FFmpeg.Conversions.FromSnippet.VisualiseAudio(Resources.Mp4WithAudio, output, size, pixelFormat, mode, amplitudeScale, frequencyScale)
await conversion.Start();
VisualiseAudio(VideoSize.Hd1080, PixelFormat.yuv420p, VisualisationMode.line, AmplitudeScale.log, FrequencyScale.lin)
There are plenty of possible outputs. Screen above is only one of the options.
If you think audio streams are redundant or you have multiple video streams and you need only default one you can use ExtractVideo snippet. It creates new file with only one video stream:
string output = Path.ChangeExtension(Path.GetTempFileName(), Path.GetExtension(Resources.Mp4WithAudio));
var conversion = FFmpeg.Conversions.FromSnippet.ExtractVideo(Resources.Mp4WithAudio, output);
await conversion.Start();
IVideoStream and IAudioStream allows split media but the easiest (but not most efficient) way is by FFmpeg.Conversions.FromSnippet.Split:
string output = Path.ChangeExtension(Path.GetTempFileName(), ".mp4");
IConversion conversion = await FFmpeg.Conversions.FromSnippet.Split(Resources.Mp4WithAudio, output, TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(8));
IConversionResult result = await conversion.Start();
Helper splits all streams in media file and copies them (splitted) to output. In example output contains a media file with duration of 6 seconds contains both audio and video streams.
Xabe.FFmpeg allows to download m3u8 playlist:
string output = Path.ChangeExtension(Path.GetTempFileName(), "mp4");
var conversion = await FFmpeg.Conversions.FromSnippet.SaveM3U8Stream(uri, output, TimeSpan.FromSeconds(1))
await conversion.Start();
/// <summary>
/// Save M3U8 stream
/// </summary>
/// <param name="uri">Uri to stream</param>
/// <param name="outputPath">Output path</param>
/// <param name="duration">Duration of stream</param>
/// <returns>Conversion result</returns>
Task<IConversion> SaveM3U8Stream(Uri uri, string outputPath, TimeSpan? duration = null);