使用 Java 进行音频操作 [关闭]

Posted

技术标签:

【中文标题】使用 Java 进行音频操作 [关闭]【英文标题】:Audio manipulation with Java [closed] 【发布时间】:2014-01-09 14:11:28 【问题描述】:

数字图像的最小单位是像素。 数字声音的最小单位是什么? 什么可以被认为是声音的像素? 怎么用java来操作呢?

【问题讨论】:

这个话题绝对是太宽泛了,声音是一个连续的波。您可以在数学上将其操作为discretize 它,但随后您正在从时间转移到频谱。你可以参加整个大学的课程。 我同意。例如,我在压缩的 avi 文件中根本找不到任何像素。 从广义上讲,音频文件的最小单位是一个“hertz”(或样本),CD 质量的音频每秒有 44,100“赫兹”。您可能需要参考这些Java Sound API 示例以了解更多信息。 这是否意味着存储 1 秒 CD 质量的音乐需要 44KB?等等,扬声器可以产生多少赫兹或采样? 称它为“帧”,而不是“赫兹”。赫兹就像 mph 或 kph,它是一种速度。数字音频数据的最小部分是一帧,它(我认为)是对 1/44100 秒的信号幅度的测量(给定 44.1k 的特定采样率)。 【参考方案1】:

声音的最小单位称为帧。对于 8 位单声道,它将是一个字节。对于立体声 16 位,它将是 4 个字节。

我们如何使用 Java 来操作它?

这取决于你想用它做什么。您需要更加具体才能获得合理的答案。

一些可能的操作是:

音量变化 潘 加快或减慢播放速度,无论有无…… 音高变化 频谱分析..

.. 扬声器可以产生多少赫兹或样本?

这在很大程度上取决于演讲者。扬声器有各种不同类型的动态范围,通常是一种没有绝对上限或下限的“钟形曲线”。

这是否意味着存储 1 秒 CD 质量的音乐需要 44KB?

每帧 CD 音质包含 4 个字节,假设它是立体声,16 位。将 4 个字节乘以 44100 计算每秒的字节数。

单声道和立体声有什么区别?

单声道有一个通道,立体声有两个。

我想做的是操纵单个声音单元,以及 - 创建自定义乐器/合成器。

在代码中生成简单的正弦声音并不难。示例见Beeper

通过播放声音的 ADSR(Attack、Decay、Sustain、Release)包络,可以创建许多其他效果。例如,将吉他音符的 ADSR 包络应用到钢琴音色上,会使它听起来像吉他,反之亦然。

什么是渠道?是否像扬声器 - 左扬声器是一个声道,右扬声器是另一个?

差不多。单声道听起来像垃圾 (IMO),而立体声可以让不同的乐器听起来像是来自不同的位置,就像乐队就坐在你面前一样。

5.1 声道声音稍微复杂一些,通常1它只是简单地“作弊”。

将左声道通过左扬声器。 将右声道通过右扬声器。 将它们均匀混合,然后通过中置扬声器播放。 仅过滤低频声音并将其通过单个低音扬声器或低音扬声器。人耳无法轻易分辨低频声音来自何处,因此这是可以接受的。低音扬声器可以放置在房间的任何位置,而且声音仍然一样。
    说实话,我不知道有什么声音格式实际上存储 5 或 6 个声道用于声音,我认为它们都是分开的(用于低音扬声器)或混合在一起(用于中置扬声器)在运行时在硬件中。在任何情况下,Java Sound 都只会直接处理一两个声道。

【讨论】:

谢谢。单声道和立体声有什么区别?我想做的是操纵单个声音单元,以及 - 创建自定义乐器/合成器。 再次感谢。什么是渠道?是否像扬声器一样 - 左扬声器是一个声道,右扬声器是另一个?我将尝试搜索 ADSR 信封。 @user3177843 是的,立体声右声道是一个声道,立体声左声道是另一个 @turbo 我明白了。感谢大家的帮助。我累了,所以我把它放在这里。 OK - 查看最新的、最新的编辑为您更近的 cmets.. 当您起床时。 :)【参考方案2】:

数字声音的最小单位是样本——特定时间点的信号电平。 [但请参阅下面的附录。]

要使用 Java 来操作它:如果您必须提出这个问题,您可能想去寻找其他人编写的库。

但是,如果您想大致了解其中涉及的内容:请阅读声音文件。如果它是压缩格式(例如 MP3),请将其解压缩。这将为您提供一个非常长的样本数组/向量。您可以剪切和粘贴其中的部分以编辑录音,或对其进行缩放以使其更柔和或更响亮(当您尝试超过最大音量时,请注意“剪辑”)。更复杂的操作是可能的,但这是digital signal processing 的完整课程,我不打算在这里尝试——网络搜索该短语,尤其是结合soundaudiomusic 应该找到更多信息。

您还可以通过以编程方式生成示例来生成自己的音频。从样本到样本呈正弦变化的信号会产生纯音。其他重复的形状增加了各种泛音。改变重复的频率会改变音高。将多个信号加在一起(同时注意削波)会将它们混合成一个信号。以此类推。

请注意,MIDI 不是“数字声音”——它是一个数字乐谱。它描述了应该在什么时候播放什么音符,但将其转化为声音取决于合成器。

附录:我之前没有听说过“框架”这个词(请参阅 Andrew 的回答),但我相信它。我想到了样本,因为我在考虑硬件层,但将其与样本区分开来意味着音频剪辑是一件好事,所以我敢打赌帧确实更正确/更当前。

【讨论】:

我主要从处理Clip 中获得术语“框架”,其中至少有3 个方法名称提及它。也许这就是 Java Sound 团队对样本的“本地化”术语。但我明白你所说的样本是什么意思,它们是一回事。如果我当天还有任何选票,我会对你的答案投赞成票(而对另一个答案投反对票)。您的回答包含一些很好的信息。 谢谢。 midi 就像一个音符组合,合成器就像乐器?如果是这样,我该如何创建自定义合成器? 自定义合成器:读取并解释控制信息(例如 MIDI 文件),以便您了解要求您在何时开始和停止哪些音符以及应用哪些修饰符。使用该信息在声音阵列中的适当时间“绘制”适当的波形。您可能需要将它与重叠的其他音符混合(总和)。播放生成的音频。请注意,以足够快的速度跟上实时播放的速度并不容易;我将其描述为一个批处理过程,您首先构建音频,然后再播放它以保持简单。 请注意,Java 不是我在编写实时软合成器时会选择的语言。除其他外,垃圾收集时间可能会弄乱输出。 哦,请仔细阅读此答案中有关 MIDI 的建议。我会把它留给@keshlam,因为他们似乎对此了解很多。我在处理采样声音方面更有经验。【参考方案3】:

在 java 中,您通常会使用 AudioInputStream 实例(您可以脱离 Java 声音 API 定义的类)。这些是按字节读取以进行播放的。 我自己从未做过操纵,但据我所知,这主要是通过 Java 声音的混音器类完成的。

下面的教程应该包含您正在寻找的所有信息: http://docs.oracle.com/javase/tutorial/sound/playing.html

【讨论】:

这是否允许我操纵单个赫兹或样本? “这些是按字节读取以进行播放的。” 这太不准确了,以至于..错误。它们逐帧处理。

以上是关于使用 Java 进行音频操作 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Linux PulseAudio 时无法关闭 Java 音频剪辑

使用 C++ 教程和示例代码进行音频流传输 [关闭]

iOS:啥是音频单元? [关闭]

如何使用 ffmpeg 从 MPEG-4 文件中提取音频 [关闭]

向Java程序添加音频[关闭]

C语言音频输入/输出[关闭]