JAVE视频处理
一.通过JAVE可以实现视频剪切,压缩,提取音乐等操作
1.jar包的导入请看这里:https://www.cnblogs.com/KdeS/p/13215089.html
2.JAVE参考文档:http://www.sauronsoftware.it/projects/jave/manual.php#6
3.jave是对ffmpeg的封装,ffmpeg的文档:https://ffmpeg.org/ffmpeg.html
JAVE.jar(官网点我) 是一个封装了FFmpeg的Java框架,在项目中能直接调用它的API来处理音视频文件;
优点:使用方便,直接在项目中引入JAVE.jar即可处理媒体文件,且开发完成后可以随工程一起打包发布,不需要在目标运行环境内手动安装FFmpeg相关的类库
缺点:JAVE.jar最后一次更新是2009年,其封装的FFmpeg版本是09年或更早前的版本,比较老旧,无法使用一些新特性
(当然也可以看看有没有其他比较新的封装了FFmpeg的框架)
4.如果jave不满足功能,可以参考这篇文档集成ffmpeg:https://www.cnblogs.com/wangsongbai/p/10521834.html
二 .关键文档介绍
音频/视频编码
最重要的JAVE类是it.sauronsoftware.jave.Encoder。编码器对象公开了许多用于多媒体转码的方法。为了使用JAVE,您始终必须创建一个Encoder:
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)
它设置将用于新编码文件的流容器的格式。给定的参数表示格式名称。编码格式名称仅当出现在使用的Encoder实例的getSupportedEncodingFormats()方法返回的列表中时才有效且受支持。public void setOffset(java.lang.Float offset)
它设置代码转换操作的偏移量。源文件将从其开始的偏移秒数开始重新编码。例如,如果您想剪切源文件的前五秒,则应在传递给编码器的EncodingAttributes对象上调用setOffset(5)。public void setDuration(java.lang.Float duration)
它设置代码转换操作的持续时间。仅源的持续时间秒数将被重新编码到目标文件中。例如,如果您想从源中提取并转码三十秒的一部分,则应在传递给编码器的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(new Integer(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解码器对带有“ DIVX”标签值的MPEG 4视频流进行解码。顺便说一下,这就是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 f / s的帧速率,则应调用setFrameRate(new Integer(30))。public void setSize(it.sauronsoftware.jave.VideoSize size)
它设置视频流中图像的大小和比例。如果未设置任何值,则编码器将保留原始大小和比例。否则,您可以使用首选大小传递 it.sauronsoftware.java.VideoSize实例。您可以使用像素值设置新编码视频的宽度和高度,并缩放原始视频。例如,如果您要将视频缩放到宽度为512像素,高度为384像素,则应调用setSize(new VideoSize(512,384))。
获取有关多媒体文件的信息
在对现有多媒体文件进行转码之前,可以调用编码器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对象使用it.sauronsoftware.jave.AudioInfo和it.sauronsoftware.jave.VideoInfo的实例来封装有关整个多媒体内容及其流的信息,以描述包装的音频和视频。这些对象类似于 EncodingAttributes,AudioAttributes和VideoAttributes的对象,但是它们以只读模式工作。查看与JAVE发行版捆绑在一起的JAVE API javadoc文档,以获取有关它们的更多详细信息。
监视转码操作
您可以使用侦听器监视代码转换操作。JAVE定义了 it.sauronsoftware.jave.EncoderProgressListener接口。此接口可以由您的应用程序实现,并且可以将具体的EncoderProgressListener实例传递给编码器。每当发生重大事件时,编码器都会调用您的侦听器方法。要将EncoderProgressListener传递给编码器,应使用encode()方法的以下定义:
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
要实现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或未设置),就会发生这种情况。 - it.sauronsoftware.jave.InputFormatException
无法解码源文件。当解码器不支持源文件容器,视频流格式或音频流格式时,就会发生这种情况。您可以通过调用编码器方法getSupportedDecodingFormats(),getAudioDecoders()和getVideoDecoders()来检查受支持的容器和插入的解码器。 - it.sauronsoftware.jave.EncoderExpection
由于内部错误,该操作在转码过程中失败。您应该检查异常消息,还可以使用EncoderProgressListener实例检查编码器发出的任何消息。
三 .demo
@Test public void testAppPush() { //原始文件 File source = new File("D:\\Software\\blibli\\Download\\Av706.mp4"); //新文件 File target = new File("D:\\Software\\blibli\\Download\\test.mp4"); try { //一.音频编码设置 AudioAttributes audio = new AudioAttributes(); /** * 它设置将用于音频流的代码转换的编解码器的名称。 * 您必须从当前Encoder实例的getAudioEncoders()方法返回的列表中选择一个值。 * 否则,您可以传递AudioAttributes.DIRECT_STREAM_COPY特殊值,该值需要从源文件复制原始音频流。 * String str[]=new Encoder().getAudioEncoders(); */ audio.setCodec("libmp3lame"); /** * 它为新的重新编码的音频流设置比特率值。如果未设置比特率值,则编码器将选择默认值。 * 该值应以每秒位数表示。例如,如果您想要128 kb / s的比特率,则应调用setBitRate(new Integer(128000))。 * 这个值越高代表音质越好 */ audio.setBitRate(new Integer(64000)); /** * 它设置将在重新编码的音频流中使用的音频通道数(1 =单声道,2 =立体声)。 * 如果未设置任何通道值,则编码器将选择默认值。 */ audio.setChannels(new Integer(1)); /** * 它为新的重新编码的音频流设置采样率。 * 如果未设置采样率值,则编码器将选择默认值。该值应以赫兹表示。 * 例如,如果您想要类似CD的44100 Hz采样率,则应调用setSamplingRate(new Integer(44100))。 * 采样率和采样大小的值越大,记录的波形更接近原始信号。 */ audio.setSamplingRate(new Integer(22050)); /** * 可以调用此方法来更改音频流的音量。 * 值为256表示音量不变(默认值)。因此,小于256的值表示音量减小,而大于256的值将增大音频流的音量。 */ audio.setVolume(600); //二.视频编码设置 VideoAttributes video = new VideoAttributes(); /** * 它设置将用于视频流转码的编解码器的名称。 * 您必须从当前Encoder实例的getVideoEncoders()方法返回的列表中选择一个值。 * 否则,您可以传递VideoAttributes.DIRECT_STREAM_COPY特殊值,该值需要从源文件复制原始视频流。 * String str[]=new Encoder().getVideoEncoders(); */ video.setCodec("mpeg4"); /** * 它为新的重新编码的视频流设置比特率值。 * 如果未设置比特率值,则编码器将选择默认值。 * 该值应以每秒位数表示。例如,如果您想要360 kb / s的比特率,则应调用setBitRate(new Integer(360000))。 * 这个值越高代表视频越清晰 */ video.setBitRate(new Integer(160000)); /** * 它设置与重新编码的视频流关联的标签/ fourcc值。如果未设置任何值,则编码器将选择默认值。 * 多媒体播放器通常使用标签值来选择在流上运行哪个视频解码器。 * 在示例中,将使用播放器使用的默认DivX解码器对带有“ DIVX”标签值的MPEG 4视频流进行解码。 * 顺便说一下,这就是DivX的确切含义:带有附加的“ DIVX”标签/ fourcc值的MPEG 4视频流! * * DivX解码器是两种AVI格式的一种,用于网络视频传输。是有损压缩格式。也是自由软件,它的另一个是xvid。 */ //video.setTag("DivX"); /** * 它为新的重新编码的音频流设置帧速率值。 * 如果未设置比特率帧速率,则编码器将选择默认值。 * 该值应以每秒帧数表示。例如,如果您想要30 f / s的帧速率,则应调用setFrameRate(new Integer(30))。 * * 值太小 会成为慢动作 */ video.setFrameRate(new Integer(15)); /** * 它设置视频流中图像的大小和比例。 * 如果未设置任何值,则编码器将保留原始大小和比例。 * 否则,您可以使用首选大小传递 it.sauronsoftware.java.VideoSize实例。您可以使用像素值设置新编码视频的宽度和高度,并缩放原始视频。 * 例如,如果您要将视频缩放到宽度为512像素,高度为384像素,则应调用setSize(new VideoSize(512,384))。 */ video.setSize(new VideoSize(512,384)); // 视频转码编码设置 EncodingAttributes attrs = new EncodingAttributes(); /** * 设置将用于新编码文件的流容器的格式。给定的参数表示格式名称。 * 编码格式名称仅当出现在使用的Encoder实例的getSupportedEncodingFormats()方法返回的列表中时才有效且受支持。 * String str[]=new Encoder().getSupportedEncodingFormats(); */ attrs.setFormat("mp4"); /** * 设置音频编码属性。如果从未在新的EncodingAttributes实例上调用,或者给定参数为null,则编码文件中将不包含音频流。 * 抽取视频时不指定即可,无音乐 */ attrs.setAudioAttributes(audio); /** * 设置视频编码属性。如果从未在新的EncodingAttributes实例上调用,或者给定参数为null,则编码文件中将不包含任何视频流 * 抽取音频时不指定参数即可,,无视频 */ attrs.setVideoAttributes(video); /** * 它设置代码转换操作的偏移量。源文件将从其开始的偏移秒数开始重新编码。 * 例如,如果您想剪切源文件的前五秒,则应在传递给编码器的EncodingAttributes对象上调用setOffset(5)。 * 视频剪切开始时间 */ attrs.setOffset((float)10); /** * 它设置代码转换操作的持续时间。仅源的持续时间秒数将被重新编码到目标文件中。 * 例如,如果您想从源中提取并转码三十秒的一部分,则应在传递给编码器的EncodingAttributes对象上调用 * 图片剪切多少秒 */ attrs.setDuration((float)10); //三.编码器 Encoder encoder = new Encoder(); encoder.encode(source, target, attrs); //获取有关多媒体文件的信息 it.sauronsoftware.jave.MultimediaInfo a=encoder.getInfo(source); System.out.println(a); System.out.println("压缩完成..."); } catch (EncoderException e) { e.printStackTrace(); } }