标签: naudio

使用NAudio的C#实时波形数据图

我是处理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)

有没有一种方法可以更快地执行此操作?

c# waveform real-time-data naudio

0
推荐指数
1
解决办法
6668
查看次数

使用 CSCore lib 获取 MP3 文件样本数据和信息

我想使用库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的回放增益之前,我需要获得必要的数据,我需要传递给上面的代码,所以我需要得到的samplerateSampleSetleftSamplesrightSamples一个MP3文件。

我需要一个完整的代码示例,说明如何使用NAudiolib 或任何其他类型的 lib来检索这些数据。

我要求完整代码的原因是因为我知道我自己不能做到这一点,我在 NAudio 库之前接触了一些其他东西,对我来说非常困难,似乎libray 是专为音频大师程序员和音频大师编写的,没有任何简单的东西。

.net vb.net audio naudio cscore

0
推荐指数
1
解决办法
1995
查看次数

不能和NAudio.Midi一起玩

我读了这个答案并尝试用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)

c# midi naudio

0
推荐指数
1
解决办法
1413
查看次数

如何使用 NAudio 从 wma 转换为 mp3

请注意这不是链接的其他问题的副本。这使用了我找不到的类,如下面的问题所述。

我正在尝试将 wma 文件转换为 mp3。我需要一个可以集成到我的代码库中的解决方案,而不是依赖于外部资源,因此使用 ffmpeg 不是一种选择。我一直在尝试 NAudio,但没有任何成功。

一个问题是周围似乎有两个版本的 NAudio,而且似乎都不完整。你从 Nuget 得到的那个不包括 WMAFileReader 类,所以没有办法(我可以看到)读取 wma 文件。github上版本包含 WMAFileReader 类,但似乎不包含 Mp3Writer 类,也不包含我在许多示例中看​​到的 WaveLib 类。

那么,有谁知道我怎样才能得到可以完成这项工作的东西?我已经浪费了几个小时尝试不同的代码示例,但它们似乎都不适用于我能找到的任一版本的 NAudio。

理想情况下,我想在内存中执行此操作,但如果我必须写入临时磁盘文件,这并不是世界末日。

编辑我刚刚发现有更多的 NAudio nuget 包扩展了基本的包。有一个用于 Lame,一个用于 WMA,但即使在安装它们之后,我也无法让任何代码工作。

c# mp3 wma naudio

0
推荐指数
1
解决办法
4132
查看次数

使用 NAudio 将 PCM 48kHz/16 比特率的 wav 文件转换为 u-law 8kHz/8 比特率

我有一个 wav 文件,需要将其转换为我们的应用程序之一可以读取的格式。我要转换的文件格式为:

  • 编码:PCM
  • 采样率:48kHz
  • 比特率:16位
  • 频道:1

我想要转换成的可读文件格式是:

  • 编码:u-Law
  • 采样率:8kHz
  • 比特率:8 位
  • 频道:1

为了实现这一点,我使用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)时抛出异常吗?

c# naudio audio-converter

0
推荐指数
1
解决办法
6670
查看次数

等待Task.Run无法在void内部工作?

我试图在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在这里不起作用.它直接跳到最后一块.

c# naudio

-2
推荐指数
1
解决办法
76
查看次数

标签 统计

naudio ×6

c# ×5

.net ×1

audio ×1

audio-converter ×1

cscore ×1

midi ×1

mp3 ×1

real-time-data ×1

vb.net ×1

waveform ×1

wma ×1