Manuale di JAVE

Prima di cominciare

Per utilizzare JAVE nella tua applicazione Java, devi aggiungere il file jave-1.0.jar al CLASSPATH.

JAVE richiede un ambiente di esecuzione Java J2SE versione 1.4 o successiva.

JAVE, inoltre, utilizza una versione di ffmpeg precompilata per Windows e Linux su piattaforma hardware i386 a 32 bit. Questo non significa che JAVE non possa funzionare su altre combinazioni, ma per farlo è nessario fornire un compilato di ffmpeg alternativo a quello incluso nella distribuzione. Maggiori dettagli sono riportati nel paragrafo "Cambiare l'eseguibile di ffmpeg in uso".

Codificare i flussi audio/video

La principale classe di JAVE è it.sauronsoftware.jave.Encoder. Gli oggetti di tipo Encoder contengono una serie di metodi utili per avere informazioni e per effettuare le operazioni di transcodifica dei flussi multimediali. Prima di ogni altra cosa, pertanto, è necessario istanziare la classe Encoder, con una chiamata del tipo:

Encoder encoder = new Encoder();

Una volta creata l'istanza, il metodo per effettuare l'operazione di transcodifica è encode(). La firma del metodo è:

public void encode(java.io.File source,
                   java.io.File target,
                   it.sauronsoftware.jave.EncodingAttributes attributes)
            throws java.lang.IllegalArgumentException,
                   it.sauronsoftware.jave.InputFormatException,
                   it.sauronsoftware.jave.EncoderException

Il primo argomento, source, è il file sorgente da decodificare. Il secondo argomento, target, costituisce il nuovo file da creare, con il flusso multimediale ricodificato secondo richiesta. L'argomento attributes, di tipo it.sauronsoftware.jave.EncodingAttributes, è una struttura dati che incapsula tutti gli argomenti necessari per la ricodifica del flusso.

Si osservi che la chiamata al metodo è bloccante: il metodo ritorna solo al termine dell'operazione di codifica (o dopo un eventuale fallimento della stessa).

Attributi di codifica

L'encoder di JAVE accetta gli attributi di codifica dei flussi multimediali attraverso un'istanza della classe it.sauronsoftware.jave.EncodingAttributes. La classe mette a disposizione i seguenti metodi:

Attributi di codifica audio

Gli attributi di codifica audio devono essere espressi attraverso un oggetto di tipo it.sauronsoftware.jave.AudioAttributes. Gli oggetti di questo tipo permotto di impostare gli attributi di ricodifica audio mediante i seguenti metodi:

Attributi di codifica video

Gli attributi di codifica video devono essere espressi attraverso un oggetto di tipo it.sauronsoftware.jave.VideoAttributes. Gli oggetti di questo tipo permotto di impostare gli attributi di ricodifica video mediante i seguenti metodi:

Monitorare l'operazione di codifica

Le operazioni di codifica possono essere monitorate durante il loro svolgimento mediante un meccanismo ad eventi basato sul paradigma dei listener. JAVE definisce l'interfaccia it.sauronsoftware.jave.EncoderProgressListener che può essere implementata per generare degli oggetti listener da fornire poi all'encoder, attraverso la variante del metodo encode così formulata:

public void encode(java.io.File source,
                   java.io.File target,
                   it.sauronsoftware.jave.EncodingAttributes attributes,
                   it.sauronsoftware.jave.EncoderProgressListener listener)
            throws java.lang.IllegalArgumentException,
                   it.sauronsoftware.jave.InputFormatException,
                   it.sauronsoftware.jave.EncoderException

L'inrefaccia EncoderProgressListener richiede la definizione dei seguenti metodi:

Fallimento dell'operazione di codifica

L'operazione di codifica può fallire. In tal caso in metodo encode() propaga un'eccezione. A seconda di quel che è accaduto, l'eccezione è differente:

Ottenere informazioni su un file multimediale

JAVE permette di avere informazioni su un file multimediale esistente prima ancora di ricodificarlo, attraverso il metodo getInfo() degli oggetti Encoder, così definito:

public it.sauronsoftware.jave.MultimediaInfo getInfo(java.io.File source)
                                             throws it.sauronsoftware.jave.InputFormatException,
                                                    it.sauronsoftware.jave.EncoderException

Gli oggetti it.sauronsoftware.jave.MultimediaInfo, che a loro volta contengono oggetti it.sauronsoftware.jave.AudioInfo e it.sauronsoftware.jave.VideoInfo, sono speculari rispetto agli oggetti di tipo EncodingAttributes, AudioAttributes e VideoAttributes, e dispongono di metodi per il recupero di informazioni quali il formato del contenitore multimediale, i decoder in grado di decodificare i flussi, informazioni su bitrate, samplerate, framerate ecc. Questi metodi possono essere facilmente consultati nella documentazione javadoc delle API di JAVE, fornita nella distribuzione stessa della libreria.

Cambiare l'eseguibile di ffmpeg in uso

JAVE non è una libreria pure Java, ma un wrapper su un progetto libero chiamato ffmpeg (http://ffmpeg.mplayerhq.hu/). Il codice di ffmpeg è in C, pertanto non ha la portabilità di Java ed è necessario disporre di una versione compilata del tool per ogni combinazione hardware/software sulla quale si vuole impiegare JAVE. La distribuzione di JAVE comprende due versioni precompilate di ffmpeg, una per Windows e una per Linux, entrambe per piattaforme hardware di tipo i386 con architettura a 32 bit. Ciò copre la maggior parte delle esigenze. In piattaforme differenti da quelle elencate è necessario generare un compilato di ffmpeg. I sorgenti e le istruzioni per farlo sono disponibili nel sito Web del progetto. Una volta ottenuto il compilato è necessario agganciarlo all'encoder di JAVE. E' possibile farlo fornendo al costruttore di Encoder un'istanza della classe astratta it.sauronsoftware.jave.FFMPEGLocator. Per far ciò è necessario estendere FFMPEGLocator andando a definire il metodo con firma:

public java.lang.String getFFMPEGExecutablePath()

Il metodo deve restituire un percorso sul file system locale che conduce all'eseguibile di ffmpeg che si intende utilizzare.

Successivamente l'encoder di JAVE può essere istanziato con una chiamata del tipo:

Encoder encoder = new Encoder(new MyFFMPEGExecutableLocator())

La stessa tecnica può essere utilizzata anche sulle piattaforme già supportate dai precompilati presenti in JAVE, al solo scopo di modificare la versione di ffmpeg in uso.

Formati supportati

Le versioni di ffmpeg precompilate e distribuite insieme a JAVE supportato i seguenti formati.

In lettura

FormatoDescrizione
4xm4X Technologies formatHandle
MTVMTV formatHandle
RoQId RoQ formatHandle
aacADTS AAC
ac3raw ac3
aiffAudio IFF
alawpcm A law formatHandle
amr3gpp amr file formatHandle
apcCRYO APC formatHandle
apeMonkey's Audio
asfasf formatHandle
auSUN AU Format
aviavi formatHandle
avsAVISynth
bethsoftvidBethesda Softworks 'Daggerfall' VID formatHandle
c93Interplay C93
daudD-Cinema audio formatHandle
dsicinDelphine Software International CIN formatHandle
dtsraw dts
dvDV video formatHandle
dxadxa
eaElectronic Arts Multimedia Format
ea_cdataElectronic Arts cdata
ffmffm formatHandle
film_cpkSega FILM/CPK formatHandle
flacraw flac
flicFLI/FLC/FLX animation formatHandle
flvflv formatHandle
gifGIF Animation
gxfGXF formatHandle
h261raw h261
h263raw h263
h264raw H264 video formatHandle
idcinId CIN formatHandle
image2image2 sequence
image2pipepiped image2 sequence
ingenientIngenient MJPEG
ipmovieInterplay MVE formatHandle
libnutnut formatHandle
m4vraw MPEG4 video formatHandle
matroskaMatroska File Format
mjpegMJPEG video
mmAmerican Laser Games MM formatHandle
mmfmmf formatHandle
mov,mp4,m4a,3gp,3g2,mj2QuickTime/MPEG4/Motion JPEG 2000 formatHandle
mp3MPEG audio layer 3
mpcmusepack
mpc8musepack8
mpegMPEG1 System formatHandle
mpegtsMPEG2 transport stream formatHandle
mpegtsrawMPEG2 raw transport stream formatHandle
mpegvideoMPEG video
mulawpcm mu law formatHandle
mxfMXF formatHandle
nsvNullSoft Video formatHandle
nutnut formatHandle
nuvNuppelVideo formatHandle
oggOgg formatHandle
psxstrSony Playstation STR formatHandle
rawvideoraw video formatHandle
redirRedirector formatHandle
rmrm formatHandle
rtspRTSP input formatHandle
s16bepcm signed 16 bit big endian formatHandle
s16lepcm signed 16 bit little endian formatHandle
s8pcm signed 8 bit formatHandle
sdpSDP
shnraw shorten
siffBeam Software SIFF
smkSmacker Video
solSierra SOL Format
swfFlash formatHandle
thpTHP
tiertexseqTiertex Limited SEQ formatHandle
ttatrue-audio
txdtxd formatHandle
u16bepcm unsigned 16 bit big endian formatHandle
u16lepcm unsigned 16 bit little endian formatHandle
u8pcm unsigned 8 bit formatHandle
vc1raw vc1
vmdSierra VMD formatHandle
vocCreative Voice File formatHandle
wavwav formatHandle
wc3movieWing Commander III movie formatHandle
wsaudWestwood Studios audio formatHandle
wsvqaWestwood Studios VQA formatHandle
wvWavPack
yuv4mpegpipeYUV4MPEG pipe formatHandle

In scrittura

FormatoDescrizione
3g23gp2 formatHandle
3gp3gp formatHandle
RoQId RoQ formatHandle
ac3raw ac3
adtsADTS AAC
aiffAudio IFF
alawpcm A law formatHandle
amr3gpp amr file formatHandle
asfasf formatHandle
asf_streamasf formatHandle
auSUN AU Format
aviavi formatHandle
crccrc testing formatHandle
dvDV video formatHandle
dvdMPEG2 PS formatHandle (DVD VOB)
ffmffm formatHandle
flacraw flac
flvflv formatHandle
framecrcframecrc testing formatHandle
gifGIF Animation
gxfGXF formatHandle
h261raw h261
h263raw h263
h264raw H264 video formatHandle
image2image2 sequence
image2pipepiped image2 sequence
libnutnut formatHandle
m4vraw MPEG4 video formatHandle
matroskaMatroska File Format
mjpegMJPEG video
mmfmmf formatHandle
movmov formatHandle
mp2MPEG audio layer 2
mp3MPEG audio layer 3
mp4mp4 formatHandle
mpegMPEG1 System formatHandle
mpeg1videoMPEG video
mpeg2videoMPEG2 video
mpegtsMPEG2 transport stream formatHandle
mpjpegMime multipart JPEG formatHandle
mulawpcm mu law formatHandle
nullnull video formatHandle
nutnut formatHandle
oggOgg formatHandle
psppsp mp4 formatHandle
rawvideoraw video formatHandle
rmrm formatHandle
rtpRTP output formatHandle
s16bepcm signed 16 bit big endian formatHandle
s16lepcm signed 16 bit little endian formatHandle
s8pcm signed 8 bit formatHandle
svcdMPEG2 PS formatHandle (VOB)
swfFlash formatHandle
u16bepcm unsigned 16 bit big endian formatHandle
u16lepcm unsigned 16 bit little endian formatHandle
u8pcm unsigned 8 bit formatHandle
vcdMPEG1 System formatHandle (VCD)
vobMPEG2 PS formatHandle (VOB)
vocCreative Voice File formatHandle
wavwav formatHandle
yuv4mpegpipeYUV4MPEG pipe formatHandle

Codec e decoder compresi

Le versioni di ffmpeg precompilate e distribuite insieme a JAVE comprendono i seguenti codec e decoder.

Decoder audio

adpcm_4xmadpcm_adxadpcm_ctadpcm_eaadpcm_ea_r1
adpcm_ea_r2adpcm_ea_r3adpcm_ea_xasadpcm_ima_amvadpcm_ima_dk3
adpcm_ima_dk4adpcm_ima_ea_eacsadpcm_ima_ea_seadadpcm_ima_qtadpcm_ima_smjpeg
adpcm_ima_wavadpcm_ima_wsadpcm_msadpcm_sbpro_2adpcm_sbpro_3
adpcm_sbpro_4adpcm_swfadpcm_thpadpcm_xaadpcm_yamaha
alacapeatrac 3cookdca
dsicinaudioflacg726imcinterplay_dpcm
liba52libamr_nblibamr_wblibfaadlibgsm
libgsm_msmace3mace6mp2mp3
mp3adump3on4mpc sv7mpc sv8mpeg4aac
nellymoserpcm_alawpcm_mulawpcm_s16bepcm_s16le
pcm_s16le_planarpcm_s24bepcm_s24daudpcm_s24lepcm_s32be
pcm_s32lepcm_s8pcm_u16bepcm_u16lepcm_u24be
pcm_u24lepcm_u32bepcm_u32lepcm_u8pcm_zork
qdm2real_144real_288roq_dpcmshorten
smackaudsol_dpcmsonictruespeechtta
vmdaudiovorbiswavpackwmav1wmav2
ws_snd1xan_dpcm   

Codec audio

ac3adpcm_adxadpcm_ima_wavadpcm_msadpcm_swf
adpcm_yamahaflacg726libamr_nblibamr_wb
libfaaclibgsmlibgsm_mslibmp3lamelibvorbis
mp2pcm_alawpcm_mulawpcm_s16bepcm_s16le
pcm_s24bepcm_s24daudpcm_s24lepcm_s32bepcm_s32le
pcm_s8pcm_u16bepcm_u16lepcm_u24bepcm_u24le
pcm_u32bepcm_u32lepcm_u8pcm_zorkroq_dpcm
sonicsoniclsvorbiswmav1wmav2

Decoder video

4xm8bpsVMware videoaascamv
asv1asv2avsbethsoftvidbmp
c93camstudiocamtasiacavscinepak
cljrcyuvdnxhddsicinvideodvvideo
dxaffv1ffvhuffflashsvflic
flvfrapsgifh261h263
h263ih264huffyuvidcinvideoindeo2
indeo3interplayvideojpeglskmvcloco
mdecmjpegmjpegbmmvideompeg1video
mpeg2videompeg4mpegvideomsmpeg4msmpeg4v1
msmpeg4v2msrlemsvideo1mszhnuv
pampbmpgmpgmyuvpng
ppmptxqdrawqpegqtrle
rawvideoroqvideorpzarv10rv20
sgismackvidsmcsnowsp5x
svq1svq3targatheorathp
tiertexseqvideotifftruemotion1truemotion2txd
ultimotionvbvc1vcr1vmdvideo
vp3vp5vp6vp6avp6f
vqavideowmv1wmv2wmv3wnv1
xan_wc3xlzlibzmbv 

Codec video

asv1asv2bmpdnxhddvvideo
ffv1ffvhuffflashsvflvgif
h261h263h263phuffyuvjpegls
libtheoralibx264libxvidljpegmjpeg
mpeg1videompeg2videompeg4msmpeg4msmpeg4v1
msmpeg4v2pampbmpgmpgmyuv
pngppmqtrlerawvideoroqvideo
rv10rv20sgisnowsvq1
targatiffwmv1wmv2zlib
zmbv    

Esempi

Il seguente codice prende un generico AVI come fonte e genera un filmato FLV a la youtube, con audio in MP3:

File source = new File("source.avi");
File target = new File("target.flv");
AudioAttributes audio = new AudioAttributes();
audio.setCodec("libmp3lame");
audio.setBitRate(new Integer(64000));
audio.setChannels(new Integer(1));
audio.setSamplingRate(new Integer(22050));
VideoAttributes video = new VideoAttributes();
video.setCodec("flv");
video.setBitRate(new Integer(160000));
video.setFrameRate(new Integer(15));
video.setSize(new VideoSize(400, 300));
EncodingAttributes attrs = new EncodingAttributes();
attrs.setFormat("flv");
attrs.setAudioAttributes(audio);
attrs.setVideoAttributes(video);
Encoder encoder = new Encoder();
encoder.encode(source, target, attrs);

Il prossimo esempio estrae l'audio da un filmato di origine e lo salva come file WAV:

File source = new File("source.avi");
File target = new File("target.wav");
AudioAttributes audio = new AudioAttributes();
audio.setCodec("pcm_s16le");
EncodingAttributes attrs = new EncodingAttributes();
attrs.setFormat("wav");
attrs.setAudioAttributes(audio);
Encoder encoder = new Encoder();
encoder.encode(source, target, attrs);

Il prossimo esempio prende un file WAV e genera un MP3 128 kbit/s, stereo, 44100 Hz:

File source = new File("source.wav");
File target = new File("target.mp3");
AudioAttributes audio = new AudioAttributes();
audio.setCodec("libmp3lame");
audio.setBitRate(new Integer(128000));
audio.setChannels(new Integer(2));
audio.setSamplingRate(new Integer(44100));
EncodingAttributes attrs = new EncodingAttributes();
attrs.setFormat("mp3");
attrs.setAudioAttributes(audio);
Encoder encoder = new Encoder();
encoder.encode(source, target, attrs);

Il prossimo esempio prende in ingresso un file AVI e ne genera un altro dove il flusso video è esattamente lo stesso della sorgente, mentre l'audio viene compresso in MP3 di bassa qualità:

File source = new File("source.avi");
File target = new File("target.avi");
AudioAttributes audio = new AudioAttributes();
audio.setCodec("libmp3lame");
audio.setBitRate(new Integer(56000));
audio.setChannels(new Integer(1));
audio.setSamplingRate(new Integer(22050));
VideoAttributes video = new VideoAttributes();
video.setCodec(VideoAttributes.DIRECT_STREAM_COPY);
EncodingAttributes attrs = new EncodingAttributes();
attrs.setFormat("avi");
attrs.setAudioAttributes(audio);
attrs.setVideoAttributes(video);
Encoder encoder = new Encoder();
encoder.encode(source, target, attrs);

Genera un AVI con video MPEG 4/DivX e audio OGG Vorbis:

File source = new File("source.avi");
File target = new File("target.avi");
AudioAttributes audio = new AudioAttributes();
audio.setCodec("libvorbis");
VideoAttributes video = new VideoAttributes();
video.setCodec("mpeg4");
video.setTag("DIVX");
video.setBitRate(new Integer(160000));
video.setFrameRate(new Integer(30));
EncodingAttributes attrs = new EncodingAttributes();
attrs.setFormat("mpegvideo");
attrs.setAudioAttributes(audio);
attrs.setVideoAttributes(video);
Encoder encoder = new Encoder();
encoder.encode(source, target, attrs);

Un video per cellulari:

File source = new File("source.avi");
File target = new File("target.3gp");
AudioAttributes audio = new AudioAttributes();
audio.setCodec("libfaac");
audio.setBitRate(new Integer(128000));
audio.setSamplingRate(new Integer(44100));
audio.setChannels(new Integer(2));
VideoAttributes video = new VideoAttributes();
video.setCodec("mpeg4");
video.setBitRate(new Integer(160000));
video.setFrameRate(new Integer(15));
video.setSize(new VideoSize(176, 144));
EncodingAttributes attrs = new EncodingAttributes();
attrs.setFormat("3gp");
attrs.setAudioAttributes(audio);
attrs.setVideoAttributes(video);
Encoder encoder = new Encoder();
encoder.encode(source, target, attrs);