- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试从一个 wav 文件中打印出一个 wave,但我有点迷失了样本的长度。
这是我想要实现的(没有颜色):
因此,为了读取我的数据,我使用以下代码:
// first we need to read our wav file, so we can get our info:
byte[] wav = File.ReadAllBytes(filename);
// then we are going to get our file's info
info.NumChannnels = wav[22];
info.SampleRate = bytesToInt(wav[24], wav[25]);
// nr of samples is the length - the 44 bytes that where needed for the offset
int samples = (wav.Length - 44) / 2;
// if there are 2 channels, we need to devide the nr of sample in 2
if (info.NumChannnels == 2) samples /= 2;
// create the array
leftChannel = new List<float>();
if (info.NumChannnels == 2) rightChannel = new List<float>();
else rightChannel = null;
int pos = 44; // start of data chunk
for (int i = 0; i < samples; i++) {
leftChannel.Add(bytesToFloat(wav[pos], wav[pos + 1]));
pos += 2;
if (info.NumChannnels == 2) {
rightChannel.Add(bytesToFloat(wav[pos], wav[pos + 1]));
pos += 2;
}
}
BytesToFloat = 将 2 个字节转换为 -1 到 1 之间的 float
所以现在我有 2 个数据列表,但是现在我应该如何创建 1 行我应该使用多少个数字?
最让我困惑的是:当你播放一首歌时,你可以在大多数音乐播放器中看到以下数据,这在我看来是 1 个样本的表示。
但是你怎么知道每个条的值,以及样本中有多少个条
最佳答案
您的问题是关于两种不同的音频可视化。要绘制波形,您发布的代码已接近准备好从中绘制,但您正在为每个样本添加一个条目到您的列表中。由于音频通常是每秒 44100 个样本,因此一首 3 分钟歌曲的波形将需要近 800 万像素。所以你要做的是将它们分批处理。对于每 4410 个像素(即 100 毫秒),找到具有最高和最低值的那个,然后用它来画线。事实上,您通常只需找到最大 Abs 值并绘制对称波形即可。
下面是一些代码,用于在 WPF 中绘制音频文件的基本 WaveForm,使用 NAudio 可以更轻松地访问样本值(它可以处理 WAV 或 MP3 文件)。我没有包括任何左右声道的分离,但这应该很容易添加:
var window = new Window();
var canvas = new Canvas();
using(var reader = new AudioFileReader(file))
{
var samples = reader.Length / (reader.WaveFormat.Channels * reader.WaveFormat.BitsPerSample / 8);
var f = 0.0f;
var max = 0.0f;
// waveform will be a maximum of 4000 pixels wide:
var batch = (int)Math.Max(40, samples / 4000);
var mid = 100;
var yScale = 100;
float[] buffer = new float[batch];
int read;
var xPos = 0;
while((read = reader.Read(buffer,0,batch)) == batch)
{
for(int n = 0; n < read; n++)
{
max = Math.Max(Math.Abs(buffer[n]), max);
}
var line = new Line();
line.X1 = xPos;
line.X2 = xPos;
line.Y1 = mid + (max * yScale);
line.Y2 = mid - (max * yScale);
line.StrokeThickness = 1;
line.Stroke = Brushes.DarkGray;
canvas.Children.Add(line);
max = 0;
xPos++;
}
canvas.Width = xPos;
canvas.Height = mid * 2;
}
window.Height = 260;
var scrollViewer = new ScrollViewer();
scrollViewer.Content = canvas;
scrollViewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
window.Content = scrollViewer;
window.ShowDialog();
第二种可视化有时称为频谱图或频谱分析仪。它不代表 1 个样本,而是代表样本 block 中存在的频率。要获得此信息,您需要通过快速傅里叶变换 (FFT) 传递样本。通常你通过 1024 个样本 block (它应该是 2 的幂)。不幸的是,如果您是 DSP 新手,FFT 可能很难使用,因为您需要学习几件事情:
您应该能够在 StackOverflow 上找到关于每个主题的更多信息。我在 this article 中写了一些关于如何在 C# 中使用 FFT 的内容。 .
关于c# - 分析wav并绘制图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13629277/
如果已知该确切样本存在于 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.
我是一名优秀的程序员,十分优秀!