java根据音频流或者音频的地址获取分贝的工具类

这篇具有很好参考价值的文章主要介绍了java根据音频流或者音频的地址获取分贝的工具类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

工具类

import lombok.extern.slf4j.Slf4j;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.UnsupportedAudioFileException;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;

@Slf4j
public class WavUtils {

    public static double getDecibels(String url) {
        try {
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(URI.create(url).toURL());
            return doCal(audioInputStream);
        } catch (UnsupportedAudioFileException | IOException e) {
            return Double.MAX_VALUE;
        }
    }

    public static double getDecibels(InputStream inputStream) {
        try (BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream)) {
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(bufferedInputStream);
            return doCal(audioInputStream);
        } catch (IOException | UnsupportedAudioFileException e) {
            return Double.MAX_VALUE;
        }
    }

    private static double doCal(AudioInputStream audioInputStream) throws IOException {
        AudioFormat audioFormat = audioInputStream.getFormat();
        if (audioFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {
            audioFormat = new AudioFormat(
                    AudioFormat.Encoding.PCM_SIGNED,
                    audioFormat.getSampleRate(),
                    audioFormat.getSampleSizeInBits() * 2,
                    audioFormat.getChannels(),
                    audioFormat.getFrameSize() * 2,
                    audioFormat.getFrameRate(),
                    true);
            audioInputStream = AudioSystem.getAudioInputStream(audioFormat, audioInputStream);
        }
        byte[] buffer = new byte[4096];
        int bytesRead;
        double sum = 0;
        int count = 0;
        while ((bytesRead = audioInputStream.read(buffer)) != -1) {
            for (int i = 0; i < bytesRead; i += 2) {
                // 将字节数据转换为 16 位有符号整数
                short sample = (short) ((buffer[i + 1] << 8) | buffer[i]);
                // 计算样本的振幅
                double amplitude = sample / 32768.0;
                // 计算振幅的平方并累加
                sum += amplitude * amplitude;
                count++;
            }
        }
        double rms = Math.sqrt(sum / count);
        double decibels = 20 * Math.log10(rms);
        decibels = Math.abs(decibels);
        log.info("decibels: {}", decibels);
        return decibels;
    }
}

测试类文章来源地址https://www.toymoban.com/news/detail-738070.html

@Test
    public void testDb() {

        try (FileInputStream stream = new FileInputStream("/path/to/file")) {
            double decibels = WavUtils.getDecibels(stream);
        } catch (Exception e) {

        }
		double decibels = WavUtils.getDecibels("url");
    }

到了这里,关于java根据音频流或者音频的地址获取分贝的工具类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java获取ip地址以及ip归属地工具类

    需要ip2region.db文件,可以前往github下载 欢迎访问我的博客网站: www.yqiu.top

    2024年02月22日
    浏览(50)
  • C#Winform中DataGridView控件根据鼠标左右键获取单元格值或者行列

    有多种方法可以获取单元格的值或者行列,此处选用了两种方式去获取分别用了CurrentCell方法和Rows[].Cells[]的方法去获取行列值 鼠标左键获取单独行列值 此处获取左键行列值的触发条件是表格中数据变化获取,对应DataGridView事件CellValueChanged。 用方法CurrentCell中的Value,RowIndex

    2024年02月09日
    浏览(45)
  • bilibili 获取播放器(或者视频)地址

    Bilibili播放-获取B站播放视频源地址的过程_ucsheep的博客-CSDN博客_bilibili视频地址 如何获取 b站视频 纯播放_三叶啦的博客-CSDN博客 bilibili-api 开发文档

    2024年02月12日
    浏览(43)
  • 高德地图根据经纬度获取地址信息

    主要是使用高德里面 地理编码与逆地理编码 的 getAddress 这个方法, 根据逆向地理编码:将地理坐标(经纬度)转换成地址描述信息,对应为AMap.Geocoder的getAddress方法。 具体使用的代码为 最后看效果 这是传的经纬度与解析出来的地理位置 如果需要正向解析将地理位置变成经

    2024年02月11日
    浏览(53)
  • 如何根据结构体中成员的地址获取整个结构体的首地址

    根据结构体成员地址,获取整个结构体的首地址,在Linux系统、鸿蒙lite os操作系统中是一个很重要的功能。 在Linux系统中是通过container_of宏函数实现的 container_of通过结构体内某个成员的地址和该成员的名字,以及结构体类型,找到该结构体变量的首地址。 在鸿蒙Lite os中是通

    2024年02月11日
    浏览(41)
  • 根据WebService接口地址获取接口定义文件(wsdl文件)

    目录 方法一:借助SoapUI生成 方法二:借助Visual Studio工具生成 根据webservice接口地址想生成wsdl文件,可以借助SoapUI生成 选中,右键,导出 以管理员身份运行命令行窗口,进入VS插件目录,使用svcutil.exe工具自动生成wsdl文件。 命令:cd C:Program Files (x86)Microsoft SDKsWindowsv7.0A

    2023年04月12日
    浏览(69)
  • 叫你如何获取客户端IP和MAC地址的工具类,实战篇(Java版)

    在开发过程中,都会遇到获取IP或MAC地址的情况,那么如何在代码层面实现获取呢?接下来就为大家从代码层面介绍获取的方式。

    2024年02月12日
    浏览(52)
  • 教你如何获取客户端IP和MAC地址的工具类,实战篇(Java版)

    在开发过程中,都会遇到获取IP或MAC地址的情况,那么如何在代码层面实现获取呢?接下来就为大家从代码层面介绍获取的方式。

    2024年02月03日
    浏览(49)
  • vue 中从后端获取到文件的 url 地址,前端根据 url 地址下载文件

    项目用的是 vben admin 框架,用的是 vue3 + TS 项目需求数据导出功能,前端需要实现文件下载功能 后端返回的是文件的 url 地址 (本项目中返回的是阿里云 oss 的文件地址) 从后端得到的是一个 url 地址,先通过 fetch api 请求这个 url 地址并转换成 blob 对象,通过 URL.createObjectUrl() 将 blo

    2024年02月06日
    浏览(49)
  • 如何利用地图API接口根据地址获取具体的经纬度?

     目录 一、登录到百度地图开放平台 二、认证为开发者 三、创建应用 四、地址转经纬度API接口 五、封装JAVA工具类 百度地图开放平台网址:https://lbsyun.baidu.com/ 这里你有两种选择,可以选择认证个人开发者或者企业开发者,区别在企业认证每日接口调用次数配额更多,并发

    2024年02月16日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包