- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
首先,这是为了家庭作业或...项目。
我无法理解如何将声音数据波绘制到项目的 Java 图形背后的想法。我必须完全从头开始使用 UI 和所有内容来完成这项任务,所以基本上是制作一个 .wav 文件编辑器。我遇到的主要问题是将声音数据放入要绘制的图表中。目前我有一个随机生成的值数组,现在正在绘制。
到目前为止,我有一个小程序在运行并验证 wav 文件是否真的是一个 wav 文件。
我正在使用 FileInputStream 读取它并验证:RIFF 字节 (0-3)、FileLength(4-7)、WAVE 字节 (8-11),然后是格式 block 格式(从末尾开始RIFF block ;并将索引定位到它的末尾并给出格式 0-3、格式 block 的长度 4-7,然后是接下来的 16 个字节用于 wave 文件的所有规范并将它们存储在它们适当的命名变量中。
一旦我到达 DATA block ,它的长度超过了我所有的声音数据,这就是我不确定如何为声音数据字节存储每个字节,或者甚至将它转换为与声音的振幅。我认为验证是相似的,所以它会是一样的,但它似乎不是那样的......要么那样,要么我一直在把一些 super 简单的东西复杂化,因为我已经盯着它看了几天了。
感谢任何帮助。
最佳答案
我不是 Java 程序员,但我对渲染音频有一定的了解,所以希望以下内容对您有所帮助...
鉴于您几乎总是拥有比可用像素多得多的样本,明智的做法是从样本数据的缓存缩减或“摘要”中提取。这通常是音频编辑器(例如 Audacity )呈现音频数据的方式。事实上,最常见的策略是计算每个像素的样本数,然后为大小为 SamplesPerPixel
的每个 block 找到最大和最小样本,然后在每个最大-最小对之间画一条垂直线。您可能希望缓存这种缩小,或者针对不同的缩放级别缓存一系列此类缩小。 Audacity 缓存到磁盘上的临时文件(“ block 文件”)。
上面的内容可能过于简单化了,但是,因为在现实中您会希望从固定大小的 block (比如 256 个样本)而不是从一个大小 SamplesPerPixel
。然后,您可以根据缓存的缩减计算进一步的“即时”缩减。关键是 SamplesPerPixel
通常是一个动态量 - 因为用户可能会随时调整 Canvas 的大小(希望这是有意义的...)。
另请记住,当您在 Canvas 上绘图时,您需要根据 Canvas 的宽度和高度来缩放样本值。最好的方法(至少在垂直方向上)是标准化样本,然后乘以 Canvas 高度。 16 位音频由 [-32768, 32767] 范围内的样本组成,因此要标准化只需将 float 除以 32768。然后反转符号(将波形翻转到 Canvas 坐标),加 1(补偿对于负值)并乘以 Canvas 高度的一半。无论如何,我就是这样做的。
This页面显示了如何使用 Java Swing 构建基本的波形显示。我没有详细查看它,但我认为它只是对数据进行下采样,而不是计算最大-最小对。当然,这不会像最大-最小方法那样提供精确的缩减,但它更容易计算。
如果您想知道如何正确地做事,您应该深入研究 Audacity 源代码(但是请注意 - 它是相当粗糙的 C++)。要获得一般概述,您可以查看 'A Fast Data Structure for Disk-Based Audio Editing' ,由 Audacity 的原作者 Dominic Mazzoni 撰写。您需要从 CMJ 购买, 然而。
关于java - 如何从我的 wav 文件中提取声音数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12879210/
如果已知该确切样本存在于 wav 中的某处(但可能与其他声音混合),是否可以使用 FFT 找到较长 wav 中出现的小 wav 样本? 编辑 (收到两个回复后):如果我有一个包含所有已知声音的库,这些
我对 .NET 中的音频完全陌生,所以请多多包涵。 我的目标是创建一个具有两个 channel 的 wav 文件。左声道将包含语音消息(使用 SpeechSynthesizer 生成的流),右声道需要
我的大部分信息都来自其他stackoverflow帖子,但没有一个真正有用。 import UIKit import AVFoundation class FaceButtonSc
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 3 年前。
这可能是一个非常简单的问题;我将一个单声道 WAV 文件转换为一个 short[] 数组,并且我有一个将其写回 WAV 文件的函数。一切正常。 (writeBuffer 是 short[] 数组) b
我们的应用程序需要知道它加载的音频文件的样本数。我们使用的库可以可靠地确定采样率,但不能确定样本数。我们是否可以仅从文件大小和采样率来计算样本数? 最佳答案 马克说什么。不,通常您需要解释标题。但是,
我正在用java做一个项目,需要我加密wave文件。那么,是否有一个直接的过程可以将波形文件转换为二进制文件并返回?我将对二进制数据应用加密算法。 最佳答案 是的。 File file = new F
我想知道如何从 .wav 文件中获取样本以执行两个 .wav 文件的窗口连接。 谁能告诉我怎么做? 最佳答案 wave标准库的模块是关键:当然在代码顶部的 import wave 之后,wave.op
我有一个几分钟长的 .wav 文件,我想将其分成不同的 10 秒 .wav 文件。 到目前为止,这是我的 python 代码: import wave import math def main(fil
我在 ffmpeg 中使用以下命令合并多个 wav 文件: -f concat -safe 0 -i /storage/emulated/0/AudioClipsForSpeakerRecogniti
我正在尝试用python实现主动降噪。我的项目由两组代码组成: 录音代码 声音过滤代码 我的目标是当您运行该程序时,它将开始通过麦克风录音。录音完成后,会生成一个名为“file1.wav”的保存文件,
我正在尝试制作一个音乐识别系统。我担心我可能没有按照预期读取 wav 样本,而且我可能会应用错误的窗口大小来进行 FFT 和其他操作。 如果你能帮我的话,那就太好了。 首先,我有一些关于 Wavs 中
如何使用 java 合并两个 wav 文件? 我试过了 this但它没有正常工作,他们还有其他方法吗? 最佳答案 如果您直接处理 wav 文件的字节,您可以在任何编程语言中使用相同的策略。对于此示例,
尝试为我的 previous question 找到解决方法,我想将用 byte[](具有 wav header )编写的 16k 8 位单声道 wav 转换为 8k 8 位单声道流/字节 []。 是
目前我正在使用一个语音到文本的翻译模型,该模型采用 .wav 文件并将音频中的可听语音转换为文本转录本。该模型之前曾用于直接录制的 .wav 音频录音。但是现在我正在尝试对视频中最初出现的音频做同样的
试图在 python 中将 wav 文件转换为 wav uLaw。 使用 pydub 的 AudioSegment,我可以使用以下命令转换为 mp3: AudioSegment.from_wav(fr
我在 xcode 项目中添加了 LibFlac。然后我在我的项目中添加了来自 Libflac 的decode/main.c。我通过了 infile.flac 并运行了项目的可执行文件,但它给出了以下错
大家好,感谢您的阅读。 我想使用 Python 的 scipy.io.wavfile 对一首歌进行一些分析。由于我只有 .mp3 格式的歌曲,因此我使用 ffmpeg 将文件转换为 .wav,方法如下
我需要连接两个音频波,以便最终输出的音频波应该有一个更平滑的交汇点。我的意思是,在连接点,假设 10 秒钟,第一个音频应该开始淡出,而另一个音频开始拾取。 我已经能够连接两个音频文件并生成单个输出,但
我需要将一个 wav 文件转换为 8000Hz 16 位单声道 Wav。我已经有一个代码,它适用于 NAudio 库,但我想使用 MemoryStream 而不是临时文件。 using System.
我是一名优秀的程序员,十分优秀!