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:mov
System.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 = 16KHz
int 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("剪切视频失败");
}
}
/**
* 等待命令执行成功,退出
*
* @param br
* @throws IOException
*/
private static void blockFfmpeg(BufferedReader br) throws IOException {
String line;
// 该方法阻塞线程,直至合成成功
while ((line = br.readLine()) != null) {
doNothing(line);
}
}
/**
* 打印日志,调试阶段可解开注释,观察执行情况
*
* @param line
*/
private static void doNothing(String line) {
// log.info(line);
}
可以搜索FFmpeg常用命令
参考连接
链接: Java实现视频,音频转码
链接: 利用jave2进行音频处理
链接: 一.通过JAVE可以实现视频剪切,压缩,提取音乐等操作
链接: JAVE官方文档
链接: 音频格式简介和PCM转换成WAV