Manipolare video con FFMpeg e C#
FFMpeg lo conosciamo bene; non conoscevo invece FFMpegCore, una librerie per .NET che ci permette di usare FFMpeg nei nostri programmi.
Quindi la prima cosa da fare è installare FFMpeg:
- metodo 1 -> scaricare i binari da qui
- usare il terminale
In questo secondo caso:
choco install ffmpeg -Y
Ovviament parlo di ambito Windows, non prendo in considerazione gli altri OS.
Fatto questo, installate la libreria nella vostra soluzione con NuGet:
Install-Package FFMpegCore
A questo punto un codice in C# di esempio:
using FFMpegCore;
using FFMpegCore.Enums;
using System;
using System.Drawing;
namespace CSharpTest
{
class Program
{
static void Main(string[] args)
{
var inputFile = "test.mp4";
var audioFile = "test.mp3";
var imgFile = "img.png";
var outputFile = "test_convert.mp4";
getInfo(inputFile);
Console.WriteLine("ESTRAGGO AUDIO");
FFMpeg.ExtractAudio(inputFile, audioFile);
Console.WriteLine("ESTRAGGO IMMAGINE");
getScreenshot(inputFile, imgFile);
Console.WriteLine("CONVERTO VIDEO");
converto(inputFile, outputFile);
}
static void getInfo(String inputFile)
{
var mediaInfo = FFProbe.Analyse(inputFile);
foreach (AudioStream audioStream in mediaInfo.AudioStreams)
{
Console.WriteLine(audioStream.CodecName);
Console.WriteLine(audioStream.CodecLongName);
Console.WriteLine(audioStream.Duration);
Console.WriteLine(audioStream.BitRate);
Console.WriteLine(audioStream.ChannelLayout);
}
Console.WriteLine(mediaInfo.Extension);
Console.WriteLine(mediaInfo.Path);
}
static void getScreenshot(String inputFile, String imgFile)
{
var mediaFileAnalysis = FFProbe.Analyse(inputFile);
_ = FFMpeg.Snapshot(mediaFileAnalysis, new Size(200, 400), TimeSpan.FromMinutes(1));
FFMpeg.Snapshot(mediaFileAnalysis, imgFile, new Size(200, 400), TimeSpan.FromMinutes(1));
}
static void converto(String inputFile, String outputFile)
{
FFMpegArguments
.FromFileInput(inputFile)
.OutputToFile(outputFile, false, options => options
.WithVideoCodec(VideoCodec.LibX264)
.WithConstantRateFactor(21)
.WithAudioCodec(AudioCodec.Aac)
.WithVariableBitrate(4)
.WithFastStart()
.Scale(VideoSize.Hd))
.ProcessSynchronously();
}
}
}
Queste le operazioni che facciamo:
- visualiziamo un pò di info sul video
- estriamo l'audio
- estraiamo un frame
- convertiamo il video in un formato più leggero per il web (confrontate le dimensioni dei due video)
Enjoy!
c# nuget ffmpeg ffmpegcore
Commentami!