四时宝库

程序员的知识宝库

利用JAVE获取音视频信息或对其进行转码

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的包装(http://ffmpeg.mplayerhq.hu/)可执行。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可执行文件支持以下多媒体容器格式:

解码

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

编码

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

内置解码器和编码器

JAVE内置ffmpeg可执行文件包含以下解码器和编码器:

音频解码器

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


音频编码器

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

视频解码器

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


视频编码器

asv1asv2bmpdnxhddvvideo
ffv1ffvhuffflashsvflvgif
h261h263h263phuffyuvjpegls
libtheoralibx264libxvidljpegmjpeg
mpeg1videompeg2videompeg4msmpeg4msmpeg4v1
msmpeg4v2pampbmpgmpgmyuv
pngppmqtrlerawvideoroqvideo
rv10rv20sgisnowsvq1
targatiffwmv1wmv2zlib
zmbv



例子

从一般的AVI到类似YouTube的FLV电影,嵌入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);

下一行从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("media\\avi2wav.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版本。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接