获取音频信息(比特率,声道,采样率)
java获取音频信息网上有很多版本,但本人在试过之后对比真实数据都不太准确,发现有个可以使用处理音频的java类库,jaudiotagger,使用这个获取到的音频信息相对准确,于是整理一下发了出来。
如果是maven构建项目,则首先需要引入依赖,如下:
<dependency>
<groupId>org</groupId>
<artifactId>jaudiotagger</artifactId>
<version>2.0.3</version>
</dependency>
之后写代码就完事了;如下所示,其中getHead()函数中主要是对音频基本信息的获取,比如格式,比特率,采样率等等。而下面的getContent()函数则是获取音频详细信息。
private static String mp3Path = "/Users/ls/Desktop/未命名文件夹/sentence-512576580971560960.mp3";
private static MP3File mp3File;
private static final int START=6;
private static void getHead() {
try {
System.out.println("----------------Loading...Head-----------------");
mp3File = new MP3File(mp3Path);//封装好的类
MP3AudioHeader header = mp3File.getMP3AudioHeader();
System.out.println("时长: " + header.getTrackLength()); //获得时长
System.out.println("比特率: " + header.getBitRate()); //获得比特率
System.out.println("音轨长度: " + header.getTrackLength()); //音轨长度
System.out.println("格式: " + header.getFormat()); //格式,例 MPEG-1
System.out.println("声道: " + header.getChannels()); //声道
System.out.println("采样率: " + header.getSampleRate()); //采样率
System.out.println("MPEG: " + header.getMpegLayer()); //MPEG
System.out.println("MP3起始字节: " + header.getMp3StartByte()); //MP3起始字节
System.out.println("精确的音轨长度: " + header.getPreciseTrackLength()); //精确的音轨长度
} catch (Exception e) {
System.out.println("没有获取到任何信息");
}
}
private static void getContent() {
try {
System.out.println("----------------Loading...Content-----------------");
AbstractID3v2Tag id3v2tag= mp3File.getID3v2Tag();
String songName=new String(id3v2tag.frameMap.get("TIT2").toString().getBytes("ISO-8859-1"),"GB2312");
String singer=new String(id3v2tag.frameMap.get("TPE1").toString().getBytes("ISO-8859-1"),"GB2312");
String author=new String(id3v2tag.frameMap.get("TALB").toString().getBytes("ISO-8859-1"),"GB2312");
System.out.println("歌名:"+songName.substring(START, songName.length()-3));
System.out.println("歌手:"+singer.substring(START,singer.length()-3));
System.out.println("专辑名:"+author.substring(START,author.length()-3));
} catch (Exception e) {
System.out.println("没有获取到任何信息");
}
System.out.println("All Info:"+mp3File.displayStructureAsPlainText());
}
切割合并音频
使用ffmpeg为最好的选择。其中在c和c++中有相应的ffmpeg工具类,java中暂时还没有支持。但可以对ffmpeg命令行熟练之后,使用java commandline调用命令行也是一个不错的选择。
需要在当前主机操作系统上安装ffmpeg工具,mac建议使用brew安装,安装完成之后使用 ffmpeg -version测试一下是否成功,环境变量是否生效。
当前支持commandline最好的工具包为org.apache.commons,依旧需要导入maven依赖。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-exec</artifactId>
<version>1.3</version>
</dependency>
其中调用linux环境下命令如下所示,命令含义为将test1和test2合成为1111.mp3。其他的类似的切割以及转码可自行去官网文档调试。
public class Utilffmpeg {
public static void main(String[] args) {
String line = "ffmpeg -y -i %s -acodec copy %s";
line = String.format(line, "\"/tmp/test1.mp3|/tmp/test2.mp3\"", "/tmp/1111.mp3");
CommandLine cmdLine = CommandLine.parse(line);
DefaultExecutor executor = new DefaultExecutor();
try {
executor.execute(cmdLine);
} catch (IOException e) {
e.printStackTrace();
}
}
}
一些坑:
在使用ffmpeg去合成音频时,一些音频的采样率即 xx Hz 这个指标可能不一样,从而导致合成出来的音频无法完整播放,因此需要先将这些音频的采样率统一,比如统一为44100Hz。
并且合并后的音频,暂时会在一些小米魅族机型中原生的浏览器webview框架无法播放,原因是缺少头文件,mp3 header missing,这时需要再次使用ffmpeg工具对音频进行重编码即可。
慎重!