JAVE
1、概述
JAVE (Java Audio Video Encoder)是一个纯Java的音视频编码器和解码器库,它是基于FFmpeg。JAVE库提供了一些简单易用的API,用于音频和视频格式的转换、编码、解码等操作。它对于一些基本的音视频处理任务来说是一个不错的选择。
这些库都是基于FFmpeg的,并允许在Java中处理音频和视频文件。使用它们可以避免直接调用外部的FFmpeg命令行工具,而是通过Java API来实现音频格式转换等操作。
1.1、操作系统支持
JAVE 需要Java 8 或更高版本。JAVE 还可以轻松移植到其他操作系统和硬件配置:
- Windows x32、x64
- MacOS Intel x64
- MacOS M1
- Linux x32、x64
- Linux ARM32、ARM64
1.2、Maven依赖
包括支持平台的所有二进制文件,比较大,不建议全部引入:
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-all-deps</artifactId>
<version>3.5.0</version>
</dependency>
推荐引入核心包和对应平台的二进制包:
<!-- 核心包 -->
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-core</artifactId>
<version>3.5.0</version>
</dependency>
Linux64位amd/intel:
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-nativebin-linux64</artifactId>
<version>3.5.0</version>
</dependency>
Linux64位arm:
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-nativebin-linux-arm64</artifactId>
<version>3.5.0</version>
</dependency>
Linux32位arm:
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-nativebin-linux-arm32</artifactId>
<version>3.5.0</version>
</dependency>
Windows64位:
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-nativebin-win64</artifactId>
<version>3.5.0</version>
</dependency>
MacOS64位:
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-nativebin-osx64</artifactId>
<version>3.5.0</version>
</dependency>
2、编码属性
2.1、AudioAttributes
音频编码属性由类的实例表示ws.schild.jave.AudioAttributes
。此类对象的可用方法有:
- public void setCodec(String codec):设置将用于音频流转码的编解码器的名称。必须从
getAudioEncoders()
返回的实例列表中选择一个值。否则可以传递AudioAttributes.DIRECT_STREAM_COPY
特殊值,这需要从源文件中复制原始音频流。 - public void setBitRate(Integer bitRate):它设置新的重新编码的音频流的比特率值。如果未设置比特率值,编码器将选择默认比特率值。该值应以每秒位数表示。例如,如果您想要 128 kb/s 比特率,您应该调用
setBitRate(new Integer(128000))
。 - public void setSamplingRate(Integer bitRate):它设置新的重新编码的音频流的采样率。如果未设置采样率值,编码器将选择默认值。该值应以赫兹表示。例如,如果您想要类似 CD 的 44100 Hz 采样率,您应该调用
setSamplingRate(new Integer(44100))
。 - public void setChannels(Integer channels):它设置将在重新编码的音频流中使用的音频通道的数量(1 = 单声道,2 = 立体声)。如果未设置通道值,编码器将选择默认通道值。
- public void setVolume(Integer volume):可以调用此方法来改变音频流的音量。值 256 表示没有音量变化。因此,小于 256 的值会降低音量,而大于 256 的值会增加音频流的音量。
2.2、VideoAttributes
视频编码属性由类的实例表示ws.schild.jave.VideoAttributes
。此类对象的可用方法有:
- public void setCodec(String codec):它设置将用于视频流转码的编解码器的名称。必须从
getVideoEncoders()
返回的Encoder 实例列表中选择一个值。否则,您可以传递VideoAttributes.DIRECT_STREAM_COPY
特殊值,这需要从源文件复制原始视频流。 - public void setTag(String tag):它设置与重新编码的视频流关联的 tag/fourcc 值。如果未设置值,编码器将选择默认值。多媒体播放器经常使用标签值来选择在流上运行的视频解码器。例如,带有“DIVX”标签值的 MPEG 4 视频流将使用播放器使用的默认 DivX 解码器进行解码。顺便说一句,这正是 DivX 的本质:带有附加“DIVX”标签/fourcc 值的 MPEG 4 视频流。
- public void setBitRate(Integer bitRate):它设置新的重新编码视频流的比特率值。如果未设置比特率值,编码器将选择默认比特率值。该值应以每秒位数表示。例如,如果您想要 360 kb/s 的比特率,您应该调用
setBitRate(new Integer(360000))
。 - public void setFrameRate(Integer bitRate):它设置新的重新编码的音频流的帧速率值。如果未设置比特率帧率,编码器将选择默认值。该值应以每秒帧数表示。例如,如果您想要 30 f/s 的帧速率,您应该调用
setFrameRate(new Integer(30))
。 - pulic void setSize(ws.schild.jave.VideoSize size):它设置视频流中图像的大小和比例。如果未设置值,编码器将保留原始大小和比例。否则,您可以传递一个ws.schild.java.VideoSize具有您首选大小的实例。您可以设置新编码视频的宽度和高度以及像素值,缩放原始视频。例如,如果您想将视频缩放到宽度为 512 像素,高度为 384 像素,您应该调用
setSize(new VideoSize(512, 384))
。
2.3、CPU限制
要将 CPU 使用率限制为 1 个或多个线程(核心),请使用以下命令:
EncodingAttributes attrs= new EncodingAttributes();
attrs.setDecodingThreads(2);
attrs.setEncodingThreads(2);
3、内置编解码器
AVE 内置 ffmpeg 可执行文件包含以下解码器和编码器:
3.1、音频解码器
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
3.2、音频编码器
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
3.3、视频解码器
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
3.4、视频编码器
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
4、使用方式
4.1、简单使用
最重要的 JAVE 类是ws.schild.jave.Encoder
. 编码器对象公开了许多多媒体转码方法。为了使用 JAVE,您始终必须创建一个编码器实例:
Encoder encoder = new Encoder();
创建实例后,您可以调用encode()方法开始转码:
public void encode(ws.schild.MultimediaObject source,
java.io.File target,
ws.schild.jave.EncodingAttributes attributes)
throws java.lang.IllegalArgumentException,
ws.schild.jave.InputFormatException,
ws.schild