martedì 20 agosto 2013

Transcoding and Media Modification > Java - FFmpeg

Nel corso di un lavoro mi è capitato di dover scrivere del codice che permettesse di effettuare delle veloci modifiche ad un filmato, quali conversioni tra formati e tagli. Dopo aver guardato diverse librerie mi sono accorto che la migliore soluzione è quella di utilizzare ffmpeg.exe, un eseguibile che permette di effettuare semplici operazioni su file multimediali, tagli, merge, cattura di un immagine.

Per effettuare delle elaborazioni video è necessario richiamare ffmpeg.exe da linea di comando, passati i corretti parametri, ad esmpio:
ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo.jpeg
Questa riga permette di ottenere un immagine .jpeg di dimensioni WxH del primo frame del filmato.
La documentazione di ffmpeg può essere trovata a questo indirizzo, tra i comandi più importanti voglio citare:

  • -r fps -> specifica il frame rate in output
  • -s size -> specifica la dimensione del filmato con sintassi LarghezzaxAltezza
  • -vcodec codec -> specifica il codec in output
Una volta capito come funziona l'eseguibile è facile creare un wrapper in Java, basta utilizzare la classe Runtime per ottenere il runtime di sistema. Di seguito vediamo da codice una funzione che presi in input due istanti di tempo, il percorso del video in input e in output utilizza ffmpeg per creare un video tagliato.


	public static void singleCut(double start, double end,String videoPathIn, String videoPathOut) throws IllegalArgumentException, InputFormatException, EncoderException, IOException, InterruptedException
	{
		String cmd = Config.FFMPEG+" -i "+ videoPathIn +" -q 5 -ss "+ start +" -to "+ end +" -y "+videoPathOut;
		//System.out.print(cmd);
		Runtime runtime = Runtime.getRuntime();
		Process p = runtime.exec(cmd);
		p.waitFor();
	}
Nel codice sovrastante Config.FFMPEG non è altro che una variabile statica con il percorso relativo al nostro file ffmpeg.exe .
Per effettuare delle conversioni ai filmati via codice vorrei anche segnalare questa libreria sviluppata da un italiano chiamata JAVE.
----------------------------------------------------------------------
ENG:
To transcode and execute single tasks on multimedia files by code the best way I found myself using is to create a wrapper around FFmpeg.exe. As you can see by the documentation this tool permits to do anything on video and audio files, things like extrapolate images or perform single cuts, are really easy and only require to read how to do it. For example the following line permits to take an image from the first frame in the video with width and height as WxH:
ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo.jpeg
To easily call FFmpeg in Java simply use Runtime class to perform what you usually do in the command line.

	public static void singleCut(double start, double end,String videoPathIn, String videoPathOut) throws IllegalArgumentException, InputFormatException, EncoderException, IOException, InterruptedException
	{
		String cmd = Config.FFMPEG+" -i "+ videoPathIn +" -q 5 -ss "+ start +" -to "+ end +" -y "+videoPathOut;
		//System.out.print(cmd);
		Runtime runtime = Runtime.getRuntime();
		Process p = runtime.exec(cmd);
		p.waitFor();
	}
The string cmd is the line we want the code to execute by doing runtime.exec(cmd), Config.FFMPEG is just a static string with the absolute path of FFmpeg.exe.
I would recommend to take a look at JAVE if you just want to do simple video trascoding, it's quite nice and fast to use.