C# 使用Naudio将每个WAV通道保存为单通道WAV文件
我正在尝试将WAV文件(PCM,48kHz,4通道,16位)转换为单通道WAV文件 我试着像这样将WAV文件拆分成4字节数组,并创建了如下所示的WaveMemoryStream,但不起作用C# 使用Naudio将每个WAV通道保存为单通道WAV文件,c#,audio,naudio,waveform,wave,C#,Audio,Naudio,Waveform,Wave,我正在尝试将WAV文件(PCM,48kHz,4通道,16位)转换为单通道WAV文件 我试着像这样将WAV文件拆分成4字节数组,并创建了如下所示的WaveMemoryStream,但不起作用 byte[] chan1ByteArray = new byte[channel1Buffer.Length]; Buffer.BlockCopy(channel1Buffer, 0, chan1ByteArray, 0, chan1ByteArray.Length); WaveMemoryStream ch
byte[] chan1ByteArray = new byte[channel1Buffer.Length];
Buffer.BlockCopy(channel1Buffer, 0, chan1ByteArray, 0, chan1ByteArray.Length);
WaveMemoryStream chan1 = new WaveMemoryStream(chan1ByteArray, sampleRate, (ushort)bitsPerSample, 1);
我在创建波头时是否遗漏了什么?或者还有更多的事情要做
WAV转换为单通道WAV文件 基本思想是源波文件包含交错的样本。一个用于第一个通道,一个用于第二个通道,依此类推。下面是一些未经测试的示例代码,让您了解如何做到这一点
var reader = new WaveFileReader("fourchannel.wav");
var buffer = new byte[2 * reader.WaveFormat.SampleRate * reader.WaveFormat.Channels];
var writers = new WaveFileWriter[reader.WaveFormat.Channels];
for (int n = 0; n < writers.Length; n++)
{
var format = new WaveFormat(reader.WaveFormat.SampleRate,16,1);
writers[n] = new WaveFileWriter(String.Format("channel{0}.wav",n+1), format);
}
int bytesRead;
while((bytesRead = reader.Read(buffer,0, buffer.Length)) > 0)
{
int offset= 0;
while (offset < bytesRead)
{
for (int n = 0; n < writers.Length; n++)
{
// write one sample
writers[n].Write(buffer,offset,2);
offset += 2;
}
}
}
for (int n = 0; n < writers.Length; n++)
{
writers[n].Dispose();
}
reader.Dispose();
var阅读器=新的波形阅读器(“fourchannel.wav”);
var buffer=新字节[2*reader.WaveFormat.SampleRate*reader.WaveFormat.Channels];
var writers=新的waveilewriter[读取器.WaveFormat.Channels];
for(int n=0;n0)
{
整数偏移=0;
while(偏移量<字节读取)
{
for(int n=0;n
根据马克·希思的回答,我努力设计了一个包含32个通道的32位浮动WAV,并通过简化他的方案使其工作。我猜这个和平代码也适用于四通道音频WAV文件
var reader = new WaveFileReader("thirtytwochannels.wav");
var writers = new WaveFileWriter[reader.WaveFormat.Channels];
for (int n = 0; n < writers.Length; n++)
{
var format = new WaveFormat(reader.WaveFormat.SampleRate, 16, 1);
writers[n] = new WaveFileWriter(string.Format($"channel{n + 1}.wav"), format);
}
float[] buffer;
while ((buffer = reader.ReadNextSampleFrame())?.Length > 0)
{
for(int i = 0; i < buffer.Length; i++)
{
// write one sample for each channel (i is the channelNumber)
writers[i].WriteSample(buffer[i]);
}
}
for (int n = 0; n < writers.Length; n++)
{
writers[n].Dispose();
}
reader.Dispose();
var reader=新的波形阅读器(“thirtytwochannels.wav”);
var writers=新的waveilewriter[读取器.WaveFormat.Channels];
for(int n=0;n0)
{
for(int i=0;i
这是我使用的一种方法,您可以设置输出单声道格式,例如BitsPerSample、SampleRate
using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace DataScraper.TranscriptionCenter
{
public class MP3ToWave
{
/// <summary>
/// Converts an MP3 file to distinct wav files, using NAudio
/// They are saved in the same directory as the MP3 file
/// </summary>
/// <param name="MP3FileIn">The MP3 file</param>
/// <returns>Returns the WAV files</returns>
public static string[] MP3FilesToTranscriptionWaveFiles(string MP3FileIn)
{
FileInfo MP3FileInfo = new FileInfo(MP3FileIn);
if (MP3FileInfo.Exists == false)
throw new Exception("File does not exist? " + MP3FileIn);
Mp3FileReader readerMP3 = null;
WaveStream PCMStream = null;
WaveFileReader readerWAV = null;
List<string> ListFilesOut = null;
WaveFileWriter[] FileWriters = null;
MemoryStream TempStream = null;
WaveFormatConversionStream WaveFormatConversionStream_ = null;
WaveFormat SaveWaveFormatMono = new WaveFormat((16 * 1000),
16,
1);
try
{
readerMP3 = new Mp3FileReader(MP3FileInfo.FullName);
PCMStream = WaveFormatConversionStream.CreatePcmStream(readerMP3);
WaveFormatConversionStream_ = new WaveFormatConversionStream(new WaveFormat(SaveWaveFormatMono.SampleRate,
SaveWaveFormatMono.BitsPerSample,
PCMStream.WaveFormat.Channels),
PCMStream);
//Each filepath, each channel
ListFilesOut = new List<string> (WaveFormatConversionStream_.WaveFormat.Channels);
//Each is a wav file out
for (int index = 0; index < WaveFormatConversionStream_.WaveFormat.Channels; index++)
{
ListFilesOut.Add(MP3FileInfo.Directory.FullName + "\\" + Path.GetFileNameWithoutExtension(MP3FileInfo.Name) + "_" + index.ToString() + ".wav");
}
//Initialize the writers
FileWriters = new WaveFileWriter[WaveFormatConversionStream_.WaveFormat.Channels];
for (int index = 0; index < WaveFormatConversionStream_.WaveFormat.Channels; index++)
{
FileWriters[index] = new WaveFileWriter(ListFilesOut[index], SaveWaveFormatMono);
}
TempStream = new MemoryStream(int.Parse("" + WaveFormatConversionStream_.Length));
WaveFileWriter NewWriter = new WaveFileWriter(TempStream, WaveFormatConversionStream_.WaveFormat);
byte[] BUFFER = new byte[1024];
int ReadLength = WaveFormatConversionStream_.Read(BUFFER, 0, BUFFER.Length);
while (ReadLength != -1 && ReadLength > 0)
{
NewWriter.Write(BUFFER, 0, ReadLength);
ReadLength = WaveFormatConversionStream_.Read(BUFFER, 0, BUFFER.Length);
}
NewWriter.Flush();
TempStream.Position = 0;
readerWAV = new WaveFileReader(TempStream);
float[] buffer = readerWAV.ReadNextSampleFrame();
while(buffer != null && buffer.Length > 0)
{
for(int i = 0; i < buffer.Length; i++)
{
FileWriters[i].WriteSample(buffer[i]);
}
buffer = readerWAV.ReadNextSampleFrame();
}
}
catch (Exception em1)
{
throw em1;
}
finally
{
try
{
//Flush each writer and close
for (int writercount = 0; writercount < FileWriters.Length; writercount++)
{
FileWriters[writercount].Flush();
FileWriters[writercount].Close();
FileWriters[writercount].Dispose();
}
}
catch
{
}
try { readerWAV.Dispose(); readerWAV = null; }
catch { }
try { WaveFormatConversionStream_.Dispose(); WaveFormatConversionStream_ = null; }
catch { }
try { PCMStream.Dispose(); PCMStream = null; }
catch { }
try { readerMP3.Dispose(); readerMP3 = null; }
catch { }
try
{
TempStream.Close(); TempStream.Dispose();
}
catch
{
}
}
return ListFilesOut.ToArray();
}
}
}
使用NAudio.Wave;
使用制度;
使用System.Collections.Generic;
使用System.IO;
使用System.Linq;
使用系统文本;
命名空间DataScraper.TransactionCenter
{
公共级MP3ToWave
{
///
///使用NAudio将MP3文件转换为不同的wav文件
///它们保存在与MP3文件相同的目录中
///
///MP3文件
///返回WAV文件
公共静态字符串[]MP3FileToTranscriptionWaveFiles(字符串MP3FileIn)
{
FileInfo MP3FileInfo=新文件信息(MP3FileIn);
if(MP3FileInfo.Exists==false)
抛出新异常(“文件不存在?”+MP3FileIn);
Mp3FileReader readerMP3=null;
WaveStream PCMStream=null;
WavelileReader readerWAV=null;
List ListFilesOut=null;
WaveFileWriter[]FileWriters=null;
MemoryStream TempStream=null;
波形转换流波形转换流=空;
WaveFormat SaveWaveFormatMono=新波形((16*1000),
16,
1);
尝试
{
readerMP3=新的Mp3FileReader(MP3FileInfo.FullName);
PCMStream=波形转换流。创建PCMStream(readerMP3);
波形转换流=新波形转换流(新波形)(SaveWaveFormatMono.SampleRate,
SaveWaveFormatMono.BitsPerSample,
PCMStream.WaveFormat.Channel),
PCMStream);
//每个文件路径、每个通道
ListFilesOut=新列表(波形转换流波形通道);
//每个都是一个wav文件输出
对于(int index=0;index0)
{
写入(缓冲区,0,读取长度);
ReadLength=波形转换流读取(缓冲区,0,缓冲区长度);
}
NewWriter.Flush();
TempStream.Position=0;
readerWAV=新的波形文件读取器(TempStream);
float[]buffer=readerWAV.ReadNextSampleFrame();
while(buffer!=null&&buffer.Length>0)
{
for(int i=0;i