Java - 调整 WAV 文件的播放速度

2024-04-24

我可能很笨,但我似乎找不到解决我的问题的方法

(NOTE:我发现很多人报告了这个问题,似乎它是由于较新的 Java(可能是 1.5?)而发生的。也许不再支持 SAMPLE_RATE?我无法找到任何解决方案).

我正在尝试调整 SAMPLE_RATE 以加快/减慢歌曲速度。我可以毫无问题地成功播放 .wav 文件,因此我研究了用于调节音量的 FloatControl:

public void adjustVolume(String audioType, float gain) {
        FloatControl gainControl = null;

        gainControl = (FloatControl) clipSFX.getControl(FloatControl.Type.MASTER_GAIN);
                if(gain > MAX_VOLUME)
                    gain = MAX_VOLUME;
                if(gain < MIN_VOLUME)
                    gain = MIN_VOLUME;

            //set volume
            gainControl.setValue(gain);
    }

但是,当尝试将此原则转化为 SAMPLE_RATE 时,我在这个阶段很早就收到了错误:

    public void adjustVolume(String audioType, float gain) {
        FloatControl gainControl = null;

        gainControl = (FloatControl) clipSFX.getControl(FloatControl.Type.SAMPLE_RATE);
        //ERROR: Exception in thread "Thread-3" java.lang.IllegalArgumentException: Unsupported control type: Sample Rate

        //I haven't gotten this far yet since the above breaks, but in theory will then set value?
            gainControl.setValue(gain);
}

我在网上找到的所有内容似乎都与从麦克风或某些外部线路获取输入有关,并且似乎没有转化为使用音频文件,所以我不确定我错过了什么。任何帮助,将不胜感激!谢谢!


这里我们有一个改变速度的方法——通过加倍采样率。基本上步骤如下:

  • 打开文件的音频流
  • 获取格式
  • 创建更改采样率的新格式
  • 打开具有该格式的数据行
  • 从文件/音频流中读取并在线播放

这里的概念是SourceDataLine、AudioFormat 和AudioInputStream。如果您查看 javax.sound 教程,您会找到它们,甚至是类的页面。您现在可以创建自己的方法(例如 adjustment(factor)),该方法仅获取新格式,而其他所有内容保持不变。

  public void play() {
    try {
      File fileIn = new File(" ....);
      AudioInputStream audioInputStream=AudioSystem.getAudioInputStream(fileIn);
      AudioFormat formatIn=audioInputStream.getFormat();
      AudioFormat format=new AudioFormat(formatIn.getSampleRate()*2, formatIn.getSampleSizeInBits(), formatIn.getChannels(), true, formatIn.isBigEndian());
          System.out.println(formatIn.toString());
          System.out.println(format.toString());
      byte[] data=new byte[1024];
      DataLine.Info dinfo=new DataLine.Info(SourceDataLine.class, format);
      SourceDataLine line=(SourceDataLine)AudioSystem.getLine(dinfo);
      if(line!=null) {
        line.open(format);
        line.start();
        while(true) {
          int k=audioInputStream.read(data, 0, data.length);
          if(k<0) break;
          line.write(data, 0, k);
        }
        line.stop();
        line.close();
      }
    }
    catch(Exception ex) { ex.printStackTrace(); }
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java - 调整 WAV 文件的播放速度 的相关文章

随机推荐

  • 具有 Azure Key Vault 的本地 ASP.NET Framework Web 应用程序

    我们正在尝试保护内部 ASP NET Framework Web 应用程序中的应用程序机密 向我提供的最初计划是使用 Azure Key Vault 我开始使用我的 Visual Studio Enterprise 订阅进行开发工作 并且在
  • Laravel,获取当前登录的用户

    我想在应用程序中显示当前登录用户的列表 我想使用 Laravel Auth 方法 我正在查看 API 但找不到类似的东西 我可能需要循环访问会话存储 然后将其与用户 ID 匹配 我对吗 更新 忘了提及 我将会话存储在数据库中 当前登录 是普
  • 为字符串数组分配内存

    我想使用两个函数填充一个字符串数组 第一个 如果我有n个字符串要分配 将分配n个内存空间 第二个将为每个读取的字符串分配内存 这是第一个函数 char allocate int n char t t char malloc n sizeof
  • 数据透视表:检测数据透视字段何时折叠

    对于数据透视表中显示的数据 我选择对数据表的某些部分应用条件格式以突出显示某些范围内的值 弄清楚如何以不同于小计数据的方式突出显示第二级行数据很有趣 但我能够解决它 我的 VBA 使用以下命令触发Worksheet PivotTableUp
  • Google / OAuth 2 - 自动登录

    我正在尝试结合一些 Google API 来使用 OAuth 2 0 虽然授权过程非常简单 但在初始授权完成后 我遇到了自动授权的问题 So 1 Authorization is done for the first time user g
  • Tomcat 是否立即支持 JAX-RS(它是否支持 JAX-RS)?

    从教材 RESTful Java with JAX RS 中我们可以读到 如果我们的应用程序服务器是 JAX RS 感知的 或者换句话说 与 JAX RS 紧密集成 则声明我们的ShoppingApplication作为 servlet 的
  • iOS/WKWebView 上 SVG 的随机故障渲染

    在我们的 iOS 应用程序中显示 SVG 图标时 我们遇到了奇怪的间歇性 非常偶然 渲染故障 基于WKWebView 当它确实发生时 它似乎可能与 CSS 相关 因为如果我在调试页面时在 Safari 中更改一些随机 甚至完全不相关 的 C
  • 电脑重启后Eclipse无法启动

    我的 Eclipse 没有启动 因为我的计算机有点冻结 所以我不得不强制重新启动它 当我不得不重新启动时 Eclipse 已打开 我相信这很可能是原因 我不知道如何解决这个问题 每当我尝试打开它时 它都会告诉我检查工作区中的 log 文件
  • PHP 根据值列计算文本文件的行数

    继续我之前的question https stackoverflow com questions 52397274 php count text file rows based on date and time 我有名为拒绝的文本日志文件
  • 在 pgAdmin 中创建 ER 图 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 请提供有关如何使用附带的管理工具构建基本实体关系图 ERD 的分步答案 postgres pgAdmi
  • Seaborn 热图引发意外错误

    我正在尝试执行以下代码 import seaborn as sns import pandas as pd import numpy as np year range 1949 1961 month January February Mar
  • 将小数转换为尽可能小的数字类型,而不会丢失任何数据

    我想写一个方法来转换decimal尽可能最小的数字类型 而不会丢失任何数据 举些例子 Convert 1 应该返回一个byte Convert 257 应该返回一个short Convert 1 1 应该返回一个float 等等 该方法的输
  • SQL:计数和子查询

    再次使用 count 和 sql 在 sqlite 上 我有表格 论文 paper id doi 年份 作者 paper id author id inst id 作者 作者 ID 姓名 名字 安装 inst id 名称 see id in
  • 在哪里检查用户电子邮件尚不存在?

    我有一个帐户对象 可以像这样创建用户 public class Account public ICollection
  • 在 JQuery 中选择自定义数据属性

    我这里有一个清单 ul li here li li are li li some li li initial li li tags li ul 其中每个 li 项都有一个自定义数据属性 在 JQuery 上如何获取具有 data value
  • 队列对象只能通过继承在进程之间共享

    我有两个 python 类 它们共享一个基类 可以说它定义了一个 multiprocessing Queue 每个类都将在单独的子进程上启动 并且需要通过队列共享信息 现在 如果基类定义了一个队列 那么每个子类对象将实例化它自己的队列 从而
  • Android 应用程序首选项会自动清除

    突然之间 每次我启动应用程序时 我的用户首选项都会被清除 我没有直接在 Activity 中使用首选项 而是在我的 Application 对象中有一个辅助类 它可以像这样访问首选项 SharedPreferences prefs Pref
  • Meteor:多个不需要的 mongodb 连接使数据库部署饱和

    我维护了一些部署在 AWS elastic beanstalk 64 位 Amazon Linux 4 5 2 上的meteor 1 7 0 3 应用程序 所有连接到托管 mongodb 部署 在 Compose 上 mongodb 版本
  • Compass (sass) 和 Web 开发人员扩展

    我经常使用 Web 开发人员扩展中的 编辑 css 功能来编辑样式表 这是一个很棒的功能 但编辑 css 并将其复制回编辑器进行保存需要时间 我计划在下一个项目中使用 Compass 我想知道如何使用 SASS Compass 的 编辑 c
  • Java - 调整 WAV 文件的播放速度

    我可能很笨 但我似乎找不到解决我的问题的方法 NOTE 我发现很多人报告了这个问题 似乎它是由于较新的 Java 可能是 1 5 而发生的 也许不再支持 SAMPLE RATE 我无法找到任何解决方案 我正在尝试调整 SAMPLE RATE