JAVE
JAVE库是在 java 包装 ffmpeg 的项目。开发人员可以利用JAVE将音频和视频文件从一种格式 转码 为另一种格式。例如,您可以将AVI文件转码为MPEG格式,您可以将 DIVX 视频流转换为(youtube like)Flash FLV格式,您可以将WAV音频文件转换为MP3格式或Ogg Vorbis 格式,您可以将它们分开转码音频和视频轨道,您可以调整视频大小,改变它们的尺寸和比例等等。JAVE支持许多其他格式,容器和操作。
要求
JAVE需要J2SE环境1.4或更高版本以及i386 / 32位硬件体系结构上的Windows或Linux操作系统。JAVE也可以轻松移植到其他操作系统和硬件配置中。
音频/ 视频编码
最重要的JAVE类是it.sauronsoftware.jave.Encoder。编码器对象公开了许多用于多媒体代码转换的方法。为了使用JAVE,你总是需要创建一个编码器:
Encoder encoder=new Encoder();
一旦创建了实例,就可以开始调用encode()方法的代码转换:
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
第一个参数source代表要解码的 源文件 。
第二个参数target是将要创建和 编码 的目标文件。
所述属性参数,其类型为it.sauronsoftware.jave.EncodingAttributes,是含有由编码器所需要的任何信息的数据结构。
请注意,对encode()的调用是阻塞的:只有在代码转换操作完成(或失败)后方法才会返回。如果您有兴趣监视转码操作,请查看“ 监视转码操作 ”部分。
编码属性
要指定有关转码操作的首选项,您必须向encode()调用提供一个it.sauronsoftware.jave.EncodingAttributes实例。您可以创建自己的EncodingAttributes实例,并且可以使用以下方法填充它:
public void setAudioAttributes (it.sauronsoftware.jave.AudioAttributes audioAttributes)
它设置 音频编码 属性。如果从未调用过新的EncodingAttributes实例,或者给定参数为null,则编码文件中不会包含任何音频流。另请参阅“ 音频编码属性 ”。
public void setVideoAttributes (it.sauronsoftware.jave.AudioAttributes videoAttributes)
它设置视频编码属性。如果从未调用过新的EncodingAttributes实例,或者给定参数为null,则编码文件中不会包含任何视频流。另请参阅“ 视频编码属性 ”。
public void setFormat (java.lang.String format)
它设置将用于新编码文件的流容器的格式。给定的参数表示格式名称。编码格式名称仅在出现在正在使用的编码器实例的getSupportedEncodingFormats()方法返回的列表中时才有效且受支持。
public void setOffset (java.lang.Float offset)
它为转码操作设置了一个偏移量。源文件将在开始时以偏移秒开始重新编码。例如,如果您想剪切源文件的前五秒,则应在传递给编码器的EncodingAttributes对象上调用setOffset(5)。
public void setDuration (java.lang.Float duration)
它为转码操作设置一个持续时间。只有源的持续秒数将被重新编码到目标文件中。例如,如果您想从源中提取并转码30秒的一部分,则应在传递给编码器的EncodingAttributes对象上调用setDuration(30)。
音频编码属性
音频编码属性由it.sauronsoftware.jave.AudioAttributes类的实例表示。这类对象的可用方法是:
public void setCodec (java.lang.String codec)
它设置将用于音频流转码的编码解码器的名称。您必须从当前Encoder实例的getAudioEncoders()方法返回的列表中选择一个值。否则,您可以传递AudioAttributes.DIRECT_STREAM_COPY特殊值,这需要从源文件复制原始音频流。
public void setBitRate (java.lang.Integer bitRate)
它为新的重新编码的音频流设置比特率值。如果未设置比特率值,则编码器将选取默认值。该值应以每秒位数表示。例如,如果你想要一个128 kb / s的比特率,你应该调用setBitRate(new Integer(128000))。
public void setSamplingRate (java.lang.Integer bitRate)
它为新的重新编码的音频流设置采样率。如果未设置采样率值,则编码器会选取默认值。值应以赫兹表示。例如,如果您需要类似CD的44100 Hz采样率,则应调用setSamplingRate(新整数(44100))。
public void setChannels (java.lang.Integer channels)
它设置将在重新编码的音频流中使用的音频通道数(1 =单声道,2 =立体声)。如果没有设置通道值,编码器将选择一个默认值。
public void setVolume (java.lang.Integer volume)
可以调用此方法来更改音频流的音量。值为256意味着没有音量变化。所以小于256的值是音量减少,而大于256的值将增加音频流的音量。
视频编码属性
视频编码属性由it.sauronsoftware.jave.VideoAttributes类的实例表示。这类对象的可用方法是:
public void setCodec (java.lang.String codec)
它设置将用于视频流转码的编解码器的名称。您必须从当前Encoder实例的getVideoEncoders()方法返回的列表中选择一个值。否则,您可以传递VideoAttributes.DIRECT_STREAM_COPY特殊值,这需要从源文件复制原始视频流。
public void setTag (java.lang.String tag)
它设置与重新编码的视频流关联的标签/ fourcc值。如果未设置任何值,则编码器会选取默认值。标签值通常被多媒体播放器用来选择在视频流上运行的视频解码器。在例子中,具有“DIVX”标签值的MPEG 4视频流将被播放器使用的默认DivX解码器解码。顺便说一句,这正是DivX的特点:一个带有“DIVX”标签/ fourcc值的MPEG 4视频流!
public void setBitRate (java.lang.Integer bitRate)
它为新的重新编码的视频流设置比特率值。如果未设置比特率值,则编码器将选取默认值。该值应以每秒位数表示。例如,如果你想要一个360 kb / s的比特率,你应该调用setBitRate(new Integer(360000))。
public void setFrameRate (java.lang.Integer bitRate)
它为新的重新编码的音频流设置帧速率值。如果没有设置比特率,则编码器会选取默认值。该值应以每秒帧数表示。例如,如果你想要一个30帧/秒的帧速率,你应该调用setFrameRate(new Integer(30))。
public void setSize (it.sauronsoftware.jave.VideoSize size)
它设置视频流中图像的大小和比例。如果未设置任何值,则编码器将保留原始尺寸和比例。否则,您可以传递it.sauronsoftware.java.VideoSize实例,并使用您的首选大小。您可以使用像素值设置新编码视频的宽度和高度,并缩放原始视频。例如,如果要将视频缩放为512像素宽度和384像素高度,则应调用setSize(new VideoSize(512,384))。
监视转码操作
你可以监听一个监听器的转码操作。JAVE定义了 it.sauronsoftware.jave.EncoderProgressListener接口。该接口可以由您的应用程序实现,具体的EncoderProgressListener实例可以传递给编码器。每当发生重大事件时,编码器都会调用您的监听器方法。要将EncoderProgressListener传递给编码器,您应该使用encode()方法的这个定义:
public void encode(java.io.File source, java.io.File target, it.sauronsoftware.jave.EncodingAttributes attribtes, it.sauronsoftware.jave.EncoderProgressListener listener) throws java.lang.IllegalArgumentException, it.sauronsoftware.jave.InputFormatException, it.sauronsoftware.jave.EncoderException
要实现EncoderProgressListener接口,您必须定义所有以下方法:
public void sourceInfo (it.sauronsoftware.jave.MultimediaInfo info)
编码器在源文件分析后调用此方法。该信息参数是实例 it.sauronsoftware.jave.MultimediaInfo类,它代表了有关源音频和视频流及其容器的信息。
public void progress (int permil)
每当编码操作完成时,编码器就会调用此方法。所述permil参数是表示通过当前操作到达点的值和它的范围是从0(操作刚开始)到1000(操作完成)。
public void message (java.lang.String message)
编码器调用此方法来通知有关转码操作的消息(通常该消息是警告)。
转码失败
当然,转码操作可能会失败。然后encode()方法会传播一个异常。根据发生的情况,例外情况将为以下情况之一:
java.lang.IllegalArgumentException
由于传递给编码器的编码属性被认为是无效的,转码操作从未开始。当给编码器的EncodingAttributes实例要求编码没有音频和没有视频流的容器(AudioAttributes和VideoAttribues属性都为null或未设置)时,Usualy会发生。
it.sauronsoftware.jave.InputFormatException
源文件无法解码。它在解码器不支持源文件容器,视频流格式或音频流格式时发生。您可以检查支持的容器和插入的解码器,调用编码器方法getSupportedDecodingFormats(),getAudioDecoders()和getVideoDecoders()。
it.sauronsoftware.jave.EncoderExpection
由于内部错误,在转码期间操作失败。您应该检查异常消息,并且还可以使用EncoderProgressListener实例来检查编码器发出的任何消息。
获取有关多媒体文件的信息
您可以在转码之前获取有关现有多媒体文件的信息,并调用编码器getInfo()方法。该的getInfo()方法为您提供了有关文件和有关其包裹音频和视频流所用的容器的信息:
public it.sauronsoftware.jave.MultimediaInfo getInfo(java.io.File source) throws it.sauronsoftware.jave.InputFormatException, it.sauronsoftware.jave.EncoderException
一个it.sauronsoftware.jave.MultimediaInfo对象使用它的实例封装整个多媒体内容及其流中的信息.sauronsoftware.jave.AudioInfo和它.sauronsoftware.jave.VideoInfo来描述封装的音频和视频。这些对象与EncodingAttributes,AudioAttributes和VideoAttributes类似 ,但它们以只读模式工作。检查与JAVE发行版捆绑在一起的JAVE API javadoc文档,以获取有关它们的更多详细信息。
使用另一个ffmpeg可执行文件
JAVE不是纯Java:它充当ffmpeg的包装()可执行。ffmpeg是一个完全用C编写的开源和免费软件项目,因此它的可执行文件不能轻易从一台机器移植到另一台机器上。您需要预编译的ffmpeg版本才能在目标机器上运行JAVE。JAVE发行版包含两个预编译的ffmpeg可执行文件:Windows和Linux,均为i386 / 32位硬件架构编译。在大多数情况下这应该足够了。如果对于您的具体情况还不够,您仍然可以运行JAVE,但您需要获取特定于平台的ffmpeg可执行文件。检查它的互联网。你甚至可以通过在官方ffmpeg网站上获取代码(以及构建它的文档)来构建它。一旦你获得了一个适合你需求的ffmpeg可执行文件,你必须将它挂在JAVE库中。这是一个简单的操作。it.sauronsoftware.jave.FFMPEGLocator。扩展它。你所要做的就是定义下面的方法:
public java.lang.String getFFMPEGExecutablePath()
此方法应该将基于文件系统的路径返回到您的自定义ffmpeg可执行文件。
一旦你的类准备好了,假设你称之为MyFFMPEGExecutableLocator,你必须创建一个替代编码器来使用它,而不是默认的定位器:
编码器编码器=新编码器(新MyFFMPEGExecutableLocator())
即使您在JAVE发行版中捆绑的可执行文件覆盖的平台上,也可以使用相同的过程切换到其他版本的ffmpeg。
无论如何要小心,并且测试你的应用程序:JAVE不能保证与自定义的ffmpeg可执行文件不同,它们与捆绑的文件不同。
支持的容器格式
JAVE内置的ffmpeg可执行文件支持以下多媒体容器格式:
解码
Formato | Descrizione |
---|---|
4xm | 4X Technologies format |
MTV | MTV format |
RoQ | Id RoQ format |
aac | ADTS AAC |
ac3 | raw ac3 |
aiff | Audio IFF |
alaw | pcm A law format |
amr | 3gpp amr file format |
apc | CRYO APC format |
ape | Monkey’s Audio |
asf | asf format |
au | SUN AU Format |
avi | avi format |
avs | AVISynth |
bethsoftvid | Bethesda Softworks ‘Daggerfall’ VID format |
c93 | Interplay C93 |
daud | D-Cinema audio format |
dsicin | Delphine Software International CIN format |
dts | raw dts |
dv | DV video format |
dxa | dxa |
ea | Electronic Arts Multimedia Format |
ea_cdata | Electronic Arts cdata |
ffm | ffm format |
film_cpk | Sega FILM/CPK format |
flac | raw flac |
flic | FLI/FLC/FLX animation format |
flv | flv format |
gif | GIF Animation |
gxf | GXF format |
h261 | raw h261 |
h263 | raw h263 |
h264 | raw H264 video format |
idcin | Id CIN format |
image2 | image2 sequence |
image2pipe | piped image2 sequence |
ingenient | Ingenient MJPEG |
ipmovie | Interplay MVE format |
libnut | nut format |
m4v | raw MPEG4 video format |
matroska | Matroska File Format |
mjpeg | MJPEG video |
mm | American Laser Games MM format |
mmf | mmf format |
mov, mp4 ,m4a,3gp,3g2,mj2 | QuickTime/MPEG4/Motion JPEG 2000 format |
mp3 | MPEG audio layer 3 |
mpc | musepack |
mpc8 | musepack8 |
mpeg | MPEG1 System format |
mpegts | MPEG2 transport stream format |
mpegtsraw | MPEG2 raw transport stream format |
mpegvideo | MPEG video |
mulaw | pcm mu law format |
mxf | MXF format |
nsv | NullSoft Video format |
nut | nut format |
nuv | NuppelVideo format |
ogg | Ogg format |
psxstr | Sony Playstation STR format |
rawvideo | raw video format |
redir | Redirector format |
rm | rm format |
rtsp | RTSP input format |
s16be | pcm signed 16 bit big endian format |
s16le | pcm signed 16 bit little endian format |
s8 | pcm signed 8 bit format |
sdp | SDP |
shn | raw shorten |
siff | Beam Software SIFF |
smk | Smacker Video |
sol | Sierra SOL Format |
swf | Flash format |
thp | THP |
tiertexseq | Tiertex Limited SEQ format |
tta | true-audio |
txd | txd format |
u16be | pcm unsigned 16 bit big endian format |
u16le | pcm unsigned 16 bit little endian format |
u8 | pcm unsigned 8 bit format |
vc1 | raw vc1 |
vmd | Sierra VMD format |
voc | Creative Voice File format |
wav | wav format |
wc3movie | Wing Commander III movie format |
wsaud | Westwood Studios audio format |
wsvqa | Westwood Studios VQA format |
wv | WavPack |
yuv4mpegpipe | YUV4MPEG pipe format |
编码
Formato | Descrizione |
---|---|
3g2 | 3gp2 format |
3gp | 3gp format |
RoQ | Id RoQ format |
ac3 | raw ac3 |
adts | ADTS AAC |
aiff | Audio IFF |
alaw | pcm A law format |
amr | 3gpp amr file format |
asf | asf format |
asf_stream | asf format |
au | SUN AU Format |
avi | avi format |
crc | crc testing format |
dv | DV video format |
dvd | MPEG2 PS format (DVD VOB) |
ffm | ffm format |
flac | raw flac |
flv | flv format |
framecrc | framecrc testing format |
gif | GIF Animation |
gxf | GXF format |
h261 | raw h261 |
h263 | raw h263 |
h264 | raw H264 video format |
image2 | image2 sequence |
image2pipe | piped image2 sequence |
libnut | nut format |
m4v | raw MPEG4 video format |
matroska | Matroska File Format |
mjpeg | MJPEG video |
mmf | mmf format |
mov | mov format |
mp2 | MPEG audio layer 2 |
mp3 | MPEG audio layer 3 |
mp4 | mp4 format |
mpeg | MPEG1 System format |
mpeg1video | MPEG video |
mpeg2video | MPEG2 video |
mpegts | MPEG2 transport stream format |
mpjpeg | Mime multipart JPEG format |
mulaw | pcm mu law format |
null | null video format |
nut | nut format |
ogg | Ogg format |
psp | psp mp4 format |
rawvideo | raw video format |
rm | rm format |
rtp | RTP output format |
s16be | pcm signed 16 bit big endian format |
s16le | pcm signed 16 bit little endian format |
s8 | pcm signed 8 bit format |
svcd | MPEG2 PS format (VOB) |
swf | Flash format |
u16be | pcm unsigned 16 bit big endian format |
u16le | pcm unsigned 16 bit little endian format |
u8 | pcm unsigned 8 bit format |
vcd | MPEG1 System format (VCD) |
vob | MPEG2 PS format (VOB) |
voc | Creative Voice File format |
wav | wav format |
yuv4mpegpipe | YUV4MPEG pipe format |
内置解码器和编码器
JAVE内置ffmpeg可执行文件包含以下解码器和编码器:
音频解码器
adpcm_4xm | adpcm_adx | adpcm_ct | adpcm_ea | adpcm_ea_r1 |
adpcm_ea_r2 | adpcm_ea_r3 | adpcm_ea_xas | adpcm_ima_amv | adpcm_ima_dk3 |
adpcm_ima_dk4 | adpcm_ima_ea_eacs | adpcm_ima_ea_sead | adpcm_ima_qt | adpcm_ima_smjpeg |
adpcm_ima_ wav | adpcm_ima_ws | adpcm_ms | adpcm_sbpro_2 | adpcm_sbpro_3 |
adpcm_sbpro_4 | adpcm_swf | adpcm_thp | adpcm_xa | adpcm_yamaha |
alac | ape | atrac 3 | cook | dca |
dsicinaudio | flac | g726 | imc | interplay_dpcm |
liba52 | libamr_nb | libamr_wb | libfaad | libgsm |
libgsm_ms | mace3 | mace6 | mp2 | mp3 |
mp3adu | mp3on4 | mpc sv7 | mpc sv8 | mpeg4aac |
nellymoser | pcm_alaw | pcm_mulaw | pcm_s16be | pcm_s16le |
pcm_s16le_planar | pcm_s24be | pcm_s24daud | pcm_s24le | pcm_s32be |
pcm_s32le | pcm_s8 | pcm_u16be | pcm_u16le | pcm_u24be |
pcm_u24le | pcm_u32be | pcm_u32le | pcm_u8 | pcm_zork |
qdm2 | real_144 | real_288 | roq_dpcm | shorten |
smackaud | sol_dpcm | sonic | truespeech | tta |
vmdaudio | vorbis | wavpack | wmav1 | wmav2 |
ws_snd1 | xan_dpcm |
音频编码器
ac3 | adpcm_adx | adpcm_ima_wav | adpcm_ms | adpcm_swf |
adpcm_yamaha | flac | g726 | libamr_nb | libamr_wb |
libfaac | libgsm | libgsm_ms | libmp3lame | libvorbis |
mp2 | pcm_alaw | pcm_mulaw | pcm_s16be | pcm_s16le |
pcm_s24be | pcm_s24daud | pcm_s24le | pcm_s32be | pcm_s32le |
pcm_s8 | pcm_u16be | pcm_u16le | pcm_u24be | pcm_u24le |
pcm_u32be | pcm_u32le | pcm_u8 | pcm_zork | roq_dpcm |
sonic | sonicls | vorbis | wmav1 | wmav2 |
视频解码器
4xm | 8bps | VMware video | aasc | amv |
asv1 | asv2 | avs | bethsoftvid | bmp |
c93 | camstudio | camtasia | cavs | cinepak |
cljr | cyuv | dnxhd | dsicinvideo | dvvideo |
dxa | ffv1 | ffvhuff | flashsv | flic |
flv | fraps | gif | h261 | h263 |
h263i | h264 | huffyuv | idcinvideo | indeo2 |
indeo3 | interplayvideo | jpegls | kmvc | loco |
mdec | mjpeg | mjpegb | mmvideo | mpeg1video |
mpeg2video | mpeg4 | mpegvideo | msmpeg4 | msmpeg4v1 |
msmpeg4v2 | msrle | msvideo1 | mszh | nuv |
pam | pbm | pgm | pgmyuv | png |
ppm | ptx | qdraw | qpeg | qtrle |
rawvideo | roqvideo | rpza | rv10 | rv20 |
sgi | smackvid | smc | snow | sp5x |
svq1 | svq3 | targa | theora | thp |
tiertexseqvideo | tiff | truemotion1 | truemotion2 | txd |
ultimotion | vb | vc1 | vcr1 | vmdvideo |
vp3 | vp5 | vp6 | vp6a | vp6f |
vqavideo | wmv1 | wmv2 | wmv3 | wnv1 |
xan_wc3 | xl | zlib | zmbv |
视频编码器
asv1 | asv2 | bmp | dnxhd | dvvideo |
ffv1 | ffvhuff | flashsv | flv | gif |
h261 | h263 | h263p | huffyuv | jpegls |
libtheora | libx264 | libxvid | ljpeg | mjpeg |
mpeg1video | mpeg2video | mpeg4 | msmpeg4 | msmpeg4v1 |
msmpeg4v2 | pam | pbm | pgm | pgmyuv |
png | ppm | qtrle | rawvideo | roqvideo |
rv10 | rv20 | sgi | snow | svq1 |
targa | tiff | wmv1 | wmv2 | zlib |
zmbv |
例子
从一般的AVI到类似YouTube的FLV电影,嵌入MP3音频流:
下一行从AVI中提取音频信息并将它们存储在纯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);
下一个示例需要一个音频WAV文件并生成一个128 kbit / s,立体声,44100 Hz MP3文件:
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);
下一个解码通用AVI文件,并创建另一个与源相同的视频流和重新编码的低质量MP3音频流:
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);
接下来,我们将生成带有MPEG 4 / DivX视频和OGG Vorbis音频的AVI:
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);
适合智能手机的视频:
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);
获取音视频信息
public static void main(String[] args) {
//文件
File source = new File(“mediaavi2wav.wav”);
Encoder encoder = new Encoder();
try {
MultimediaInfo m = encoder.getInfo(source);
//格式
m.getFormat();
//时长
long ls = m.getDuration();
System.out.println(“此视频时长为:” + ls / 60000 + “分” + ls / 1000 + “秒!”);
} catch (Exception e) {
e.printStackTrace();
}
}
注意:官方给的文档下载jave1.0.2的版本是2009年更新的,有些许bug,可下载jave2.0版本。