Manipolare video con FFMpeg e C#

Mattepuffo's logo
Manipolare video con FFMpeg e C#

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!


Condividi

Commentami!