Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Naudio将每个WAV通道保存为单通道WAV文件_C#_Audio_Naudio_Waveform_Wave - Fatal编程技术网

C# 使用Naudio将每个WAV通道保存为单通道WAV文件

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

我正在尝试将WAV文件(PCM,48kHz,4通道,16位)转换为单通道WAV文件

我试着像这样将WAV文件拆分成4字节数组,并创建了如下所示的WaveMemoryStream,但不起作用

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