Java——JAVE(音视频格式转换)
吴声子夜歌 2024-06-13 09:35:02 阅读 63
目录
JAVE1、概述1.1、操作系统支持1.2、Maven依赖 2、编码属性2.1、AudioAttributes2.2、VideoAttributes2.3、CPU限制 3、内置编解码器3.1、音频解码器3.2、音频编码器3.3、视频解码器3.4、视频编码器 4、使用方式4.1、简单使用4.2、监控转码操作4.3、异常处理4.4、获取多媒体文件信息 5、示例5.1、任意音频->mp35.2、AVI -> FLV5.3、AVI -> WAV5.4、WAV -> MP35.5、AVI -> AVI(MP3音频流)5.6、AVI -> AVI(mpeg)5.7、AVI -> 3GP5.8、将视频转码为H.264编码(包括音频转码)5.9、将音频转码为mp3编码5.10、视频文件转为音频文件
JAVE
1、概述
JAVE (Java Audio Video Encoder)是一个纯Java的音视频编码器和解码器库,它是基于FFmpeg。JAVE库提供了一些简单易用的API,用于音频和视频格式的转换、编码、解码等操作。它对于一些基本的音视频处理任务来说是一个不错的选择。
这些库都是基于FFmpeg的,并允许在Java中处理音频和视频文件。使用它们可以避免直接调用外部的FFmpeg命令行工具,而是通过Java API来实现音频格式转换等操作。
1.1、操作系统支持
JAVE 需要Java 8 或更高版本。JAVE 还可以轻松移植到其他操作系统和硬件配置:
Windows x32、x64MacOS Intel x64MacOS M1Linux x32、x64Linux 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_4xmadpcm_adxadpcm_ctadpcm_eaadpcm_ea_r1 adpcm_ea_r2 adpcm_ea_r3adpcm_ea_xasadpcm_ima_amvadpcm_ima_dk3 adpcm_ima_dk4adpcm_ima_ea_eacsadpcm_ima_ea_seadadpcm_ima_qt adpcm_ima_smjpeg adpcm_ima_wavadpcm_ima_wsadpcm_ms adpcm_sbpro_2adpcm_sbpro_3 adpcm_sbpro_4adpcm_swfadpcm_thp adpcm_xaadpcm_yamaha alacapeatrac 3cookdca dsicinaudioflacg726 imcinterplay_dpcm liba52libamr_nblibamr_wblibfaadlibgsm libgsm_ms mace3mace6mp2mp3 mp3adump3on4mpc sv7mpc sv8mpeg4aac nellymoserpcm_alawpcm_mulawpcm_s16bepcm_s16le pcm_s16le_planar pcm_s24bepcm_s24daudpcm_s24lepcm_s32be pcm_s32lepcm_s8 pcm_u16bepcm_u16lepcm_u24be pcm_u24lepcm_u32bepcm_u32le pcm_u8pcm_zork qdm2real_144real_288roq_dpcmshorten smackaud sol_dpcmsonictruespeechtta vmdaudiovorbiswavpackwmav1wmav2 ws_snd1xan_dpcm
3.2、音频编码器
ac3adpcm_adxadpcm_ima_wavadpcm_msadpcm_swf adpcm_yamahaflac g726libamr_nblibamr_wb libfaaclibgsmlibgsm_mslibmp3lamelibvorbis mp2pcm_alawpcm_mulawpcm_s16bepcm_s16le pcm_s24bepcm_s24daud pcm_s24lepcm_s32bepcm_s32le pcm_s8pcm_u16bepcm_u16le pcm_u24bepcm_u24le pcm_u32bepcm_u32lepcm_u8pcm_zorkroq_dpcm sonicsoniclsvorbiswmav1wmav2
3.3、视频解码器
4xm8bpsVMware videoaascamv asv1asv2avsbethsoftvidbmp c93 camstudiocamtasiacavscinepak cljrcyuvdnxhddsicinvideodvvideo dxa ffv1ffvhuffflashsvflic flvfrapsgifh261h263 h263ih264huffyuvidcinvideo indeo2 indeo3interplayvideojpeglskmvcloco mdecmjpegmjpegbmmvideo mpeg1video mpeg2videompeg4mpegvideomsmpeg4msmpeg4v1 msmpeg4v2msrlemsvideo1mszhnuv pampbmpgmpgmyuvpng ppmptx qdrawqpegqtrle rawvideoroqvideorpzarv10rv20 sgismackvidsmcsnow sp5x svq1svq3targatheorathp tiertexseqvideotifftruemotion1truemotion2 txd ultimotionvbvc1vcr1vmdvideo vp3vp5vp6vp6avp6f vqavideowmv1 wmv2wmv3wnv1 xan_wc3xlzlibzmbv
3.4、视频编码器
asv1asv2bmpdnxhddvvideo ffv1ffvhuffflashsvflvgif h261h263h263p huffyuvjpegls libtheoralibx264libxvidljpegmjpeg mpeg1videompeg2video mpeg4msmpeg4msmpeg4v1 msmpeg4v2pampbmpgmpgmyuv pngppm qtrlerawvideoroqvideo rv10rv20sgisnowsvq1 targatiffwmv1wmv2zlib 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.jave.EncoderException
第一个参数source表示要解码的源文件二个参数 target 是将要创建和编码的目标文件属性参数的类型为ws.schild.jave.EncodingAttributes
,是包含编码器所需的任何信息的数据结构
请注意,对 的调用encode()是阻塞调用:只有在转码操作完成(或失败)后该方法才会返回。如果您对监控转码操作感兴趣,请查看“监控转码操作”部分。编码属性
要指定有关转码操作的首选项,您必须ws.schild.jave.EncodingAttributes
为调用提供一个实例encode()。您可以创建自己的 EncodingAttributes 实例,并可以使用以下方法填充它:
public void setAudioAttributes(ws.schild.jave.AudioAttributes audioAttributes)
它设置音频编码属性。如果从未调用新的 EncodingAttributes 实例,或者给定参数为 null,则编码文件中不会包含任何音频流。
public void setVideoAttributes(ws.schild.jave.AudioAttributes videoAttributes)
它设置视频编码属性。如果从未调用新的 EncodingAttributes 实例,或者给定参数为 null,则编码文件中不会包含任何视频流。
public void setFormat(java.lang.String format)
它设置将用于新编码文件的流容器的格式。给定的参数表示格式名称。getSupportedEncodingFormats()仅当编码格式名称出现在由正在使用的 Encoder 实例的方法返回的列表中时,该名称才是有效且受支持的。
public void setOffset(java.lang.Float offset)
它设置转码操作的偏移量。源文件将从其开始后的 offset 秒处开始重新编码。例如,如果您想剪切源文件的前五秒,您应该调用setOffset(5)传递给编码器的 EncodingAttributes 对象。
public void setDuration(java.lang.Float duration)
它设置转码操作的持续时间。只有源的持续时间秒才会在目标文件中重新编码。例如,如果您想从源中提取并转码 30 秒的一部分,则应调用传递setDuration(30)给编码器的 EncodingAttributes 对象。
4.2、监控转码操作
可以使用侦听器监视转码操作。JAVE定义了ws.schild.jave.EncoderProgressListener
接口。该接口可以由您的应用程序实现,并且EncoderProgressListener可以将具体实例传递给编码器。每次发生重大事件时,编码器都会调用您的侦听器方法。
要将侦听器传递EncoderProgressListener给编码器,您应该使用该encode()方法的定义:
public void encode(ws.schild.MultimediaObject source, java.io.File target, ws.schild.jave.EncodingAttributes attributes, ws.schild.jave.EncoderProgressListener listener) throws java.lang.IllegalArgumentException, ws.schild.jave.InputFormatException, ws.schild.jave.EncoderException
要实现 EncoderProgressListener 接口,您必须定义以下所有方法:
public void sourceInfo(ws.schild.jave.MultimediaInfo info)
编码器在分析源文件后调用此方法。info 参数是该类的实例ws.schild.jave.MultimediaInfo,它表示有关源音频和视频流及其容器的信息。
public void progress(int permil)
每次编码操作完成时,编码器都会调用此方法。permil 参数是表示当前操作到达的点的值,其范围是从 0(操作刚刚开始)到 1000(操作完成)。
public void message(java.lang.String message)
该方法由编码器调用以通知有关转码操作的消息(通常该消息是警告)。
4.3、异常处理
当然,转码操作可能会失败。然后encode()方法将传播一个异常。根据发生的情况,异常将是以下之一:
java.lang.IllegalArgumentException
由于传递给编码器的编码属性已被识别为无效,因此转码操作从未开始。通常,当提供给编码器的 EncodingAttributes 实例请求对没有音频和视频流的容器进行编码(AudioAttributes 和 VideoAttribues 属性均为 null 或未设置)时,通常会发生这种情况。
ws.schild.jave.InputFormatException
源文件无法解码。当解码器不支持源文件容器、视频流格式或音频流格式时,就会发生这种情况。您可以检查支持的容器和插入的解码器调用编码器方法getSupportedDecodingFormats()
,getAudioDecoders()
和getVideoDecoders()
。
ws.schild.jave.EncoderExpection
由于内部错误,转码过程中操作失败。您应该检查异常消息,并且还可以使用 EncoderProgressListener 实例来检查编码器发出的任何消息。
4.4、获取多媒体文件信息
可以在对现有多媒体文件进行转码之前调用编码器getInfo()
方法来获取有关该文件的信息。该getInfo()方法为您提供有关文件使用的容器及其包装的音频和视频流的信息:
MultimediaObject mmObject= new MultimediaObject(myFile);MultimediaInfo infos= mmObject.getInfo();
或者:
MultimediaObject mmObject= new MultimediaObject(myURL);MultimediaInfo infos= mmObject.getInfo();
对象ws.schild.jave.MultimediaInfo
封装有关整个多媒体内容及其流的信息,使用ws.schild.jave.AudioInfo
和的实例ws.schild.jave.VideoInfo
来描述封装的音频和视频。这些对象与 EncodingAttributes、AudioAttributes 和 VideoAttributes 类似,但它们以只读模式工作。
5、示例
5.1、任意音频->mp3
public class ConvertingAnyAudioToMp3 { /** * 将任意音频格式转换为mp3格式 * @param source 源音频文件 * @param target 目标音频文件 * @return 注意,此方法是阻塞的,只有在转码操作完成或失败后,该方法才会返回 */ public boolean convertingAnyAudioToMp3WithAProgressListener(File source, File target) { ConvertProgressListener listener = new ConvertProgressListener(); boolean succeeded =true; try { //Audio Attributes / 音频编码属性 AudioAttributes audio = new AudioAttributes(); /* * 它设置将用于音频流转码的编解码器的名称。您必须从当前Encoder实例的getAudioEncoders()方法返回的列表中选择一个值。 * 否则,您可以传递AudioAttributes.DIRECT_STREAM_COPY特殊值,该值需要源文件中原始音频流的副本。 */ audio.setCodec("libmp3lame"); /* * 它设置新重新编码的音频流的比特率值。如果未设置比特率值,编码器将选择默认值。该值应以每秒位数表示。 * 例如,如果你想要128 kb / s比特率,你应该调用setBitRate(new Integer(128000))。 */ audio.setBitRate(128000); /* 它设置将在重新编码的音频流中使用的音频通道的数量(1 =单声道,2 =立体声)。如果未设置通道值,编码器将选择默认值。 */ audio.setChannels(2); /* * 它设置新重新编码的音频流的采样率。如果未设置采样率值,编码器将选择默认值。该值应以赫兹表示。 * 例如,如果您想要类似CD的44100Hz采样率,则应调用setSamplingRate(new Integer(44100))。 */ audio.setSamplingRate(44100); /* 可以调用此方法来改变音频流的音量。值256表示没有音量变化。因此,小于256的值是音量减小,而大于256的值将增加音频流的音量。 */ audio.setVolume(new Integer(256)); // Encoding attributes/编码属性 EncodingAttributes attrs = new EncodingAttributes(); /* * 它设置将用于新编码文件的流容器的格式。给定参数表示格式名称。 * 编码格式名称有效且仅在它出现在正在使用的Encoder实例的getSupportedEncodingFormats()方法返回的列表中时才受支持。 */ attrs.setFormat("mp3"); /* 它设置音频编码属性。如果从未调用过新的EncodingAttributes实例,或者给定参数为null,则编码文件中不会包含任何音频流 */ attrs.setAudioAttributes(audio); /* * 它为转码操作设置偏移量。源文件将从其开始的偏移秒开始重新编码。例如,如果您想剪切源文件的前五秒, * 则应在传递给编码器的EncodingAttributes对象上调用setOffset(5)。 */ // attrs.setOffset(5F); /* * 它设置转码操作的持续时间。只有源的持续时间秒才会在目标文件中重新编码。例如,如果您想从源中提取和转码30秒的一部分, * 则应在传递给编码器的EncodingAttributes对象上调用setDuration(30) */ // attrs.setDuration(30F); // Encode/编码 Encoder encoder = new Encoder(); encoder.encode(new MultimediaObject(source), target, attrs, listener); } catch (Exception e) { e.printStackTrace(); succeeded = false; } return succeeded; } public class ConvertProgressListener implements EncoderProgressListener { //编码器在分析源文件后调用此方法。该信息参数是实例ws.schild.java.MultimediaInfo类 //它代表了有关源音频和视频流及其容器的信息 @Override public void sourceInfo(MultimediaInfo multimediaInfo) { } //每次完成编码操作的进度时编码器调用该方法。 //所述permil参数是表示通过当前操作到达点的值和它的范围是从0(操作刚开始)到100(操作完成) @Override public void progress(int permil) { double progress = permil / 1000.00; System.out.println(progress); } //编码器调用该方法以通知关于代码转换操作的消息(通常消息是警告) @Override public void message(String s) { } } public static void main(String[] args) { ConvertingAnyAudioToMp3 converter = new ConvertingAnyAudioToMp3(); File source = new File("女人如书-安静-女人如书.m4a"); File target = new File("女人如书-安静-女人如书.mp3"); boolean flag = converter.convertingAnyAudioToMp3WithAProgressListener(source, target); System.out.println(flag); }}
5.2、AVI -> FLV
从通用 AVI 到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(new MultimediaObject(source), target, attrs);
5.3、AVI -> WAV
从 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(new MultimediaObject(source), target, attrs);
5.4、WAV -> MP3
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(new MultimediaObject(source), target, attrs);
5.5、AVI -> AVI(MP3音频流)
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(new MultimediaObject(source), target, attrs);
5.6、AVI -> AVI(mpeg)
AVI生成带有 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(new MultimediaObject(source), target, attrs);
5.7、AVI -> 3GP
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(new MultimediaObject(source), target, attrs);
5.8、将视频转码为H.264编码(包括音频转码)
/** * 视频转码 * @param videoSource * @param videoTarget * @return true or false */ public static boolean videoToVideo(String videoSource, String videoTarget) { // Date time = new Date();// SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");// System.out.println(simpleDateFormat.format(time)); long start = System.currentTimeMillis(); File source = new File(videoSource); File target = new File(videoTarget); AudioAttributes audio = new AudioAttributes(); audio.setCodec("aac"); audio.setBitRate(236000 / 2); audio.setChannels(2); audio.setSamplingRate(8000); VideoAttributes video = new VideoAttributes(); video.setCodec("h264"); video.setBitRate(1000000); video.setFrameRate(25); video.setQuality(4);// video.setSize(new VideoSize(720, 480)); EncodingAttributes attrs = new EncodingAttributes(); attrs.setOutputFormat("mp4"); attrs.setAudioAttributes(audio); attrs.setVideoAttributes(video); Encoder encoder = new Encoder(); try { encoder.encode(new MultimediaObject(source), target, attrs); return true; } catch (Exception e) { e.printStackTrace(); System.out.println(encoder.getUnhandledMessages()); return false; }finally { // time = new Date();// System.out.println(simpleDateFormat.format(time)); long end = System.currentTimeMillis(); System.out.println("总耗时:"+ (end-start) +"ms"); } }
5.9、将音频转码为mp3编码
/** * m4r音频格式转换为mp3,audioPath可更换为要转换的音频格式 * @param audioPath * @param mp3Path */ public static void m4rToMp3(String audioPath,String mp3Path){ File source = new File(audioPath); File target = new File(mp3Path); AudioAttributes audio = new AudioAttributes(); audio.setCodec("libmp3lame"); audio.setBitRate(128000); audio.setChannels(2); audio.setSamplingRate(44100); EncodingAttributes attrs = new EncodingAttributes(); attrs.setOutputFormat("mp3"); attrs.setAudioAttributes(audio); Encoder encoder = new Encoder(); try { encoder.encode(new MultimediaObject(source), target, attrs); } catch (EncoderException e) { e.printStackTrace(); } }
5.10、视频文件转为音频文件
/** * 视频文件转音频文件 * @param videoPath * @param audioPath * return true or false */ public static boolean videoToAudio(String videoPath, String audioPath){ File fileMp4 = new File(videoPath); File fileMp3 = new File(audioPath); AudioAttributes audio = new AudioAttributes(); audio.setCodec("libmp3lame"); audio.setBitRate(128000); audio.setChannels(2); audio.setSamplingRate(44100); EncodingAttributes attrs = new EncodingAttributes(); attrs.setOutputFormat("mp3"); attrs.setAudioAttributes(audio); Encoder encoder = new Encoder(); MultimediaObject mediaObject = new MultimediaObject(fileMp4); try{ encoder.encode(mediaObject,fileMp3,attrs); Log.info("File MP4 convertito MP3"); return true; }catch (Exception e){ Log.error("File non convertito"); Log.error(e.getMessage()); return false; } }
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。