java中处理音频的常用框架
首先了解FFmpeg
FFmpeg是一款开源软件,用于生成处理多媒体数据的各类库和程序。FFmpeg可以转码、处理视频和图片(调整视频、图片大小,去噪等)、打包、传输及播放视频。作为最受欢迎的视频和图像处理软件,它被来自各行各业的不同公司所广泛使用。
链接: 一文简述FFmpeg
- 视频压缩
- 支持视频打包
- 视频截图功能
- 视频添加水印
- 支持音频、视频容器格式转换
- 下载视频
- ffprobe 用于获取音视频文件的信息
- libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构
和读取音视频帧等功能; - libavcodec:用于各种类型声音/图像编解码;
- libavutil:包含一些公共的工具函数;
- libswscale:用于视频场景比例缩放、色彩映射转换;
- libpostproc:用于后期效果处理;
- ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;
- ffsever:一个 HTTP 多媒体即时广播串流服务器;
- ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;
JAVE2
JAVE2 (Java Audio Video Encoder) 类库是一个 ffmpeg 项目的 Java 语言封装。开发人员可以使用JAVE 在不同的格式间转换视频和音频。例如将 AVI 转成 MPEG 动画,等等 ffmpeg 中可以完成的在 JAVE 都有对应的方法。
链接: jave2-github地址
优点:使用方便,直接在项目中引入即可处理媒体文件,且开发完成后可以随工程一起打包发布,不需要在目标运行环境内手动安装
FFmpeg相关的类库
代码实现
其它系统的依赖包去https://github.com/a-schild/jave2官网查看
<!-- JAVE2(Java音频视频编码器)库是ffmpeg项目上的Java包装器。 --><dependency><groupId>ws.schild</groupId><artifactId>jave-core</artifactId><version>3.1.1</version></dependency><!-- 在windows上开发 开发机可实现压缩效果 window64位 --><dependency><groupId>ws.schild</groupId><artifactId>jave-nativebin-win32</artifactId><version>3.1.1</version></dependency><dependency><groupId>ws.schild</groupId><artifactId>jave-nativebin-win64</artifactId><version>3.1.1</version></dependency>
/*** 获取音频文件的编码信息** @param filePath* @throws EncoderException*/private static void info(String filePath) throws EncoderException {File file = new File(filePath);MultimediaObject multimediaObject = new MultimediaObject(file);MultimediaInfo info = multimediaObject.getInfo();// 时长long duration = info.getDuration();String format = info.getFormat();// format:movSystem.out.println("format:" + format);AudioInfo audio = info.getAudio();// 它设置将在重新编码的音频流中使用的音频通道数(1 =单声道,2 =立体声)。如果未设置任何通道值,则编码器将选择默认值。int channels = audio.getChannels();// 它为新的重新编码的音频流设置比特率值。如果未设置比特率值,则编码器将选择默认值。// 该值应以每秒位数表示。例如,如果您想要128 kb / s的比特率,则应调用setBitRate(new Integer(128000))。int bitRate = audio.getBitRate();// 它为新的重新编码的音频流设置采样率。如果未设置采样率值,则编码器将选择默认值。该值应以赫兹表示。例如,如果您想要类似CD// 采样率、音频采样级别 16000 = 16KHzint samplingRate = audio.getSamplingRate();// 设置音频音量// 可以调用此方法来更改音频流的音量。值为256表示音量不变。因此,小于256的值表示音量减小,而大于256的值将增大音频流的音量。// setVolume(Integer volume)String decoder = audio.getDecoder();System.out.println("声音时长:毫秒" + duration);System.out.println("声道:" + channels);System.out.println("bitRate:" + bitRate);System.out.println("samplingRate 采样率、音频采样级别 16000 = 16KHz:" + samplingRate);// aac (LC) (mp4a / 0x6134706D)System.out.println("decoder:" + decoder);}
/*** 音频格式转换* @param inputFormatPath* @param outputFormatPath* @return*/public static boolean audioEncode(String inputFormatPath, String outputFormatPath) {String outputFormat = getSuffix(outputFormatPath);String inputFormat = getSuffix(inputFormatPath);File source = new File(inputFormatPath);File target = new File(outputFormatPath);try {MultimediaObject multimediaObject = new MultimediaObject(source);// 获取音频文件的编码信息MultimediaInfo info = multimediaObject.getInfo();AudioInfo audioInfo = info.getAudio();//设置音频属性AudioAttributes audio = new AudioAttributes();audio.setBitRate(audioInfo.getBitRate());audio.setSamplingRate(audioInfo.getSamplingRate());audio.setChannels(audioInfo.getChannels());// 设置转码属性EncodingAttributes attrs = new EncodingAttributes();attrs.setInputFormat(inputFormat);attrs.setOutputFormat(outputFormat);attrs.setAudioAttributes(audio);// 音频转换格式类Encoder encoder = new Encoder();// 进行转换encoder.encode(new MultimediaObject(source), target, attrs);return true;} catch (IllegalArgumentException | EncoderException e) {e.printStackTrace();}return false;}/*** 获取文件路径的.后缀* @param outputFormatPath* @return*/private static String getSuffix(String outputFormatPath) {return outputFormatPath.substring(outputFormatPath.lastIndexOf(".") + 1);}
可以调用FFmpeg
/*** 剪切视频** @param sourcePath* @param targetPath* @param offetTime 起始时间,格式 00:00:00.000 小时:分:秒.毫秒* @param endTime 同上* @throws Exception*/public static void cutAv(String sourcePath, String targetPath, String offetTime, String endTime) {try {ProcessWrapper ffmpeg = new DefaultFFMPEGLocator().createExecutor();ffmpeg.addArgument("-ss");ffmpeg.addArgument(offetTime);ffmpeg.addArgument("-t");ffmpeg.addArgument(endTime);ffmpeg.addArgument("-i");ffmpeg.addArgument(sourcePath);ffmpeg.addArgument("-vcodec");ffmpeg.addArgument("copy");ffmpeg.addArgument("-acodec");ffmpeg.addArgument("copy");ffmpeg.addArgument(targetPath);ffmpeg.execute();try (BufferedReader br = new BufferedReader(new InputStreamReader(ffmpeg.getErrorStream()))) {blockFfmpeg(br);}log.info("切除视频成功={}", targetPath);} catch (IOException e) {throw new RuntimeException("剪切视频失败");}}
可以搜索FFmpeg常用命令
参考连接
链接: Java实现视频,音频转码
链接: 利用jave2进行音频处理
链接: 一.通过JAVE可以实现视频剪切,压缩,提取音乐等操作
链接: JAVE官方文档
链接: 音频格式简介和PCM转换成WAV