java获取音频信息(比特率,声道,采样率),处理切割、合并音频

获取音频信息(比特率,声道,采样率)

          java获取音频信息网上有很多版本,但本人在试过之后对比真实数据都不太准确,发现有个可以使用处理音频的java类库,jaudiotagger,使用这个获取到的音频信息相对准确,于是整理一下发了出来。

          如果是maven构建项目,则首先需要引入依赖,如下:

        
            org
            jaudiotagger
            2.0.3
        

          之后写代码就完事了;如下所示,其中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依赖。

        
            org.apache.commons
            commons-exec
            1.3
        

    其中调用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工具对音频进行重编码即可。

慎重!

你可能感兴趣的:(多媒体处理,音视频处理)