我是处理wav文件和C#的新手。我的目标是在wavfile波形中实时绘制数据。我的意思是在录制声音(wav)文件时,我想同时绘制其图形。我搜索了一些声音库并决定使用NAudio。(不知道这对我来说是最佳选择。我愿意接受有关选择音频库的任何建议)。但是我不知道使用声音进行实时数据绘图的想法。有人建议使用GDI,但正如我所说,我是新手,我认为有效使用GDI会花费太多时间。如果我必须学习GDI,请分享任何可以帮助像我这样的初学者的文章。实际上,我看起来不知道该从哪里开始。需要指导:))我有一个问题。
NAudio的教程之一,他使用字节数组在Chart中绘制波形。如果您知道wav文件的大小,那很好。但是它的工作速度太慢,对于大于10mb的wav文件,它会给出内存不足异常。下面的代码指的是我的意思。
OpenFileDialog open = new OpenFileDialog();
open.Filter = "Wave File (*.wav)|*.wav;";
if (open.ShowDialog() != DialogResult.OK) return;
chart1.Series.Add("wave");
chart1.Series["wave"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.FastLine;
chart1.Series["wave"].ChartArea = "ChartArea1";
NAudio.Wave.WaveChannel32 wave = new NAudio.Wave.WaveChannel32(new NAudio.Wave.WaveFileReader(open.FileName));
byte[] buffer = new byte[426565];
int read;
while (wave.Position < wave.Length)
{
read = wave.Read(buffer, 0, 426565);
for (int i = 0; i < read / 4; i++)
{
chart1.Series["wave"].Points.Add(BitConverter.ToSingle(buffer, i * 4));
}
}
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以更快地执行此操作?
我想使用库NReplayGain来计算 MP3 文件的重播,然后使用TagLibSharp库(带有非官方开源重播支持修改)将ID3v2重播标签写入文件。
好吧,这应该是使用 NReplayGain 库计算样本集重放增益的伪代码,正如他们的网站所示:https : //github.com/karamanolev/NReplayGain
Dim trackGain As New TrackGain(samplerate, samplesize)
For Each sampleSet As SampleSet In track
trackGain.AnalyzeSamples(sampleSet.leftSamples, sampleSet.rightSamples)
Next
Dim gain As Double = trackGain.GetGain()
Dim peak As Double = trackGain.GetPeak()
Run Code Online (Sandbox Code Playgroud)
(...但如果我需要说实话,我不确切知道什么是 SampleSet(所有帧都加入了?))
试图计算sampleset的回放增益之前,我需要获得必要的数据,我需要传递给上面的代码,所以我需要得到的samplerate,SampleSet,leftSamples和rightSamples一个MP3文件。
我需要一个完整的代码示例,说明如何使用NAudiolib 或任何其他类型的 lib来检索这些数据。
我要求完整代码的原因是因为我知道我自己不能做到这一点,我在 NAudio 库之前接触了一些其他东西,对我来说非常困难,似乎libray 是专为音频大师程序员和音频大师编写的,没有任何简单的东西。
我读了这个答案并尝试用NAudio.Midi播放一个音符:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using NAudio.Midi;
using System.Threading;
namespace SoundVision10
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
//Thread.Sleep inside GUI is just for example
using (MidiOut midiOut = new MidiOut(0))
{
midiOut.Volume = 65535;
midiOut.Send(MidiMessage.StartNote(60, 127, 0).RawData);
MessageBox.Show("Sent");
Thread.Sleep(1000);
midiOut.Send(MidiMessage.StopNote(60, 0, 0).RawData);
Thread.Sleep(1000);
} …Run Code Online (Sandbox Code Playgroud) 请注意这不是链接的其他问题的副本。这使用了我找不到的类,如下面的问题所述。
我正在尝试将 wma 文件转换为 mp3。我需要一个可以集成到我的代码库中的解决方案,而不是依赖于外部资源,因此使用 ffmpeg 不是一种选择。我一直在尝试 NAudio,但没有任何成功。
一个问题是周围似乎有两个版本的 NAudio,而且似乎都不完整。你从 Nuget 得到的那个不包括 WMAFileReader 类,所以没有办法(我可以看到)读取 wma 文件。github上的版本包含 WMAFileReader 类,但似乎不包含 Mp3Writer 类,也不包含我在许多示例中看到的 WaveLib 类。
那么,有谁知道我怎样才能得到可以完成这项工作的东西?我已经浪费了几个小时尝试不同的代码示例,但它们似乎都不适用于我能找到的任一版本的 NAudio。
理想情况下,我想在内存中执行此操作,但如果我必须写入临时磁盘文件,这并不是世界末日。
编辑我刚刚发现有更多的 NAudio nuget 包扩展了基本的包。有一个用于 Lame,一个用于 WMA,但即使在安装它们之后,我也无法让任何代码工作。
我有一个 wav 文件,需要将其转换为我们的应用程序之一可以读取的格式。我要转换的文件格式为:
我想要转换成的可读文件格式是:
为了实现这一点,我使用NAudio库。我用于转换的代码大致如下:
using (WaveFileReader reader = new WaveFileReader(inputWavFilePath))
{
WaveFormat newFormat = WaveFormat.CreateMuLawFormat(8000, 1);
using (var conversionStream = new WaveFormatConversionStream(newFormat, reader))
{
WaveFileWriter.CreateWaveFile(outputWavFilePath, conversionStream);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的转换会引发错误
AcmNotPossible 调用 acmStreamOpen
我已经看到了一些从 u-law 转换为 PCM 的链接,但在反向操作时遇到了麻烦。
我很难理解的是为什么当我转换时不会抛出PCM/48kHz/16bit -> uLaw/48kHz/8bit异常。但是,当我尝试将结果文件转换为抛出异常时。uLaw/8kHz/8bit
我是处理音频文件和不同格式的新手,所以如果我错过了一些简单的东西,我很抱歉。
有人可以解释一下为什么转换只在采样率转换时抛出异常,而不是在其他两个转换(编码PCM -> uLaw&& 16bit -> 8bit)时抛出异常吗?
我试图在waveOut.play()上运行"await Task.Run".原因是我想要这样做是因为我需要在waveOut.play()完成后立即删除文件.但是,我无法删除已经在使用的东西,这就是为什么我需要使用await task.run,但这次似乎不起作用.这可能是重复但我无法找到任何理由为什么程序不等待它完成.
public async void PlayAudio(object sender, GenericEventArgs<Stream> args)
{
fileName = $"{ Guid.NewGuid() }.wav";
using (var file = File.OpenWrite(Path.Combine(Directory.GetCurrentDirectory(), fileName)))
{
args.EventData.CopyTo(file);
file.Flush();
}
WaveOut waveOut = new WaveOut();
WaveFileReader reader = new WaveFileReader(fileName);
waveOut.Init(reader);
try
{
await Task.Run(() =>
{
waveOut.Play();
});
}
finally
{
File.Delete(fileName);
}
}
Run Code Online (Sandbox Code Playgroud)
程序按字符串名称查找文件并播放它.await task.run在这里不起作用.它直接跳到最后一块.