您的位置 首页 java

利用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的包装()可执行。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可执行文件包含以下解码器和编码器:

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

音频解码器

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版本。

文章来源:智云一二三科技

文章标题:利用JAVE获取音视频信息或对其进行转码

文章地址:https://www.zhihuclub.com/170887.shtml

关于作者: 智云科技

热门文章

网站地图