Ejemplo n.º 1
0
        /// <summary>
        /// 合并Wave文件
        /// </summary>
        /// <param name="inputWaveFiles">需要合并的Wave文件数组</param>
        /// <param name="outputWaveFile">合并后的Wave文件</param>
        public static void MergeWav(string[] inputWaveFiles, string outputWaveFile)
        {
            if (inputWaveFiles.Length < 1)
            {
                return;
            }

            FileStream fsInput  = new FileStream(inputWaveFiles[0], FileMode.Open, FileAccess.Read);
            FileStream fsOutput = new FileStream(outputWaveFile, FileMode.Create, FileAccess.Write);

            byte[] buffer = new byte[2048];
            int    total  = 0;
            int    count;

            while ((count = fsInput.Read(buffer, 0, buffer.Length)) > 0)
            {
                fsOutput.Write(buffer, 0, count);
                total += count;
            }

            fsInput.Close();
            for (int i = 1; i < inputWaveFiles.Length; i++)
            {
                string         file            = inputWaveFiles[i];
                WaveHeaderInfo header          = ResolveHeader(file);
                FileStream     dataInputStream = header.DataInputStream;
                while ((count = dataInputStream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    fsOutput.Write(buffer, 0, count);
                    total += count;
                }

                dataInputStream.Close();
            }

            fsOutput.Flush();
            fsOutput.Close();
            WaveHeaderInfo outputHeader = ResolveHeader(outputWaveFile);

            outputHeader.DataInputStream.Close();
            FileStream fs = new FileStream(outputWaveFile, FileMode.Open, FileAccess.ReadWrite);

            fs.Seek(4, SeekOrigin.Begin);
            byte[] fileLen = IntToBytes(total + outputHeader.DataOffset - 8);
            fs.Write(fileLen, 0, 4);
            fs.Seek(outputHeader.DataSizeOffset, SeekOrigin.Begin);
            byte[] dataLen = IntToBytes(total);
            fs.Write(dataLen, 0, 4);
            fs.Close();
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 解析头部,并获得文件指针指向数据开始位置的InputStreram
        /// </summary>
        /// <param name="wavFile">文件全路径名称</param>
        /// <returns></returns>
        private static WaveHeaderInfo ResolveHeader(string wavFile)
        {
            FileStream fs = new FileStream(wavFile, FileMode.Open, FileAccess.Read);

            byte[]         byte4      = new byte[4];
            byte[]         buffer     = new byte[2048];
            int            readCount  = 0;
            WaveHeaderInfo waveHeader = new WaveHeaderInfo();

            fs.Read(byte4, 0, byte4.Length); //RIFF
            fs.Read(byte4, 0, byte4.Length);
            readCount += 8;
            waveHeader.FileSizeOffset = 4;
            waveHeader.FileSize       = BytesToInt(byte4);
            fs.Read(byte4, 0, byte4.Length); //WAVE
            fs.Read(byte4, 0, byte4.Length); //fmt
            fs.Read(byte4, 0, byte4.Length);
            readCount += 12;
            int fmtLen = BytesToInt(byte4);

            fs.Read(buffer, 0, fmtLen);
            readCount += fmtLen;
            fs.Read(byte4, 0, byte4.Length); //data or fact
            readCount += 4;
            if (IsFmt(byte4, 0))
            {
                //包含fmt段
                fs.Read(byte4, 0, byte4.Length);
                int factLen = BytesToInt(byte4);
                fs.Read(buffer, 0, factLen);
                fs.Read(byte4, 0, byte4.Length); //data
                readCount += 8 + factLen;
            }

            fs.Read(byte4, 0, byte4.Length); //data size
            int dataLen = BytesToInt(byte4);

            waveHeader.DataSize       = dataLen;
            waveHeader.DataSizeOffset = readCount;
            readCount                 += 4;
            waveHeader.DataOffset      = readCount;
            waveHeader.DataInputStream = fs;
            return(waveHeader);
        }