Exemplo n.º 1
0
        public static Stream Convert(Stream inputStream)
        {
            using (var fileReader = new WaveFileReader(inputStream))
            {
                Pcm8BitToSampleProvider sampleProvider = new Pcm8BitToSampleProvider(fileReader);
                SampleToWaveProvider    waveProvider   = new SampleToWaveProvider(sampleProvider);
                var outStream = new MemoryStream();
                using (var fileWriter = new LameMP3FileWriter(outStream, waveProvider.WaveFormat, 24))
                {
                    int buff_length = 1024 * 1024;
                    var buff        = new byte[buff_length];
                    int position    = 0;
                    int length      = waveProvider.Read(buff, position, buff_length);

                    while (length > 0)
                    {
                        position += length;

                        fileWriter.Write(buff, (int)fileWriter.Position, length);
                        length = waveProvider.Read(buff, position, buff_length);
                    }
                    fileWriter.Flush();

                    return(outStream);
                }
            }
        }
Exemplo n.º 2
0
        public void SetWaveData(byte[] data)
        {
            if (data == null || data.Length == 0)
            {
                lock (lockObj) {
                    this.data = new float[0];
                }
                return;
            }
            var samples = new List <float>();

            using (var stream = new MemoryStream(data)) {
                using (var waveFileReader = new WaveFileReader(stream)) {
                    if (waveFileReader.WaveFormat.SampleRate != 44100)
                    {
                        throw new Exception($"SampleRate {waveFileReader.WaveFormat.SampleRate}");
                    }
                    ISampleProvider sampleProvider = null;
                    switch (waveFileReader.WaveFormat.BitsPerSample)
                    {
                    case 8:
                        sampleProvider = new Pcm8BitToSampleProvider(waveFileReader);
                        break;

                    case 16:
                        sampleProvider = new Pcm16BitToSampleProvider(waveFileReader);
                        break;

                    case 24:
                        sampleProvider = new Pcm24BitToSampleProvider(waveFileReader);
                        break;

                    case 32:
                        sampleProvider = new Pcm32BitToSampleProvider(waveFileReader);
                        break;

                    default:
                        throw new Exception($"Unexpected bits per sample {waveFileReader.WaveFormat.BitsPerSample}");
                    }
                    if (waveFileReader.WaveFormat.Channels == 2)
                    {
                        sampleProvider = sampleProvider.ToMono(1, 0);
                    }
                    else if (waveFileReader.WaveFormat.Channels != 1)
                    {
                        throw new Exception($"Unexpected channel count {waveFileReader.WaveFormat.Channels}");
                    }
                    var buffer = new float[sampleProvider.WaveFormat.SampleRate];
                    int n;
                    while ((n = sampleProvider.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        samples.AddRange(buffer.Take(n));
                    }
                }
            }
            lock (lockObj) {
                this.data = samples.ToArray();
                ApplyEnvelope(this.data, envelope);
            }
        }
Exemplo n.º 3
0
        public static MemorySampleProvider FromStream(Stream stream)
        {
            using (var waveProvider = new WaveFileReader(stream)) {
                ISampleProvider sampleProvider = null;
                switch (waveProvider.WaveFormat.BitsPerSample)
                {
                case 8:
                    sampleProvider = new Pcm8BitToSampleProvider(waveProvider);
                    break;

                case 16:
                    sampleProvider = new Pcm16BitToSampleProvider(waveProvider);
                    break;

                case 24:
                    sampleProvider = new Pcm24BitToSampleProvider(waveProvider);
                    break;

                case 32:
                    sampleProvider = new Pcm32BitToSampleProvider(waveProvider);
                    break;

                default:
                    Log.Error($"Unknown PCM bits per sample {waveProvider.WaveFormat.BitsPerSample}");
                    return(null);
                }

                var format  = sampleProvider.WaveFormat;
                var samples = new List <float>();
                var buffer  = new float[format.SampleRate];
                var n       = 0;
                while ((n = sampleProvider.Read(buffer, 0, buffer.Length)) > 0)
                {
                    samples.AddRange(buffer.Take(n));
                }
                var data = samples.ToArray();
                return(new MemorySampleProvider()
                {
                    WaveFormat = format,
                    data = data,
                });
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// 混音
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_mixerVoice_Click(object sender, EventArgs e)
        {
            string fileName1  = txt_inputPath1.Text;
            string fileName2  = txt_inputPath2.Text;
            string fileOutPut = txt_outputPath.Text;

            if (fileName1 == "" || fileName1 == string.Empty)
            {
                MessageBox.Show("输入文件为空");
            }
            if (fileName2 == "" || fileName2 == string.Empty)
            {
                MessageBox.Show("输入文件为空");
            }
            if (fileOutPut == "" || fileOutPut == string.Empty)
            {
                MessageBox.Show("输出文件为空");
            }
            List <byte> buf1 = new List <byte>();
            List <byte> buf2 = new List <byte>();

            using (FileStream fsinput1 = new FileStream(fileName1, FileMode.Open, FileAccess.Read))
            {
                int x = 0;
                while (true)
                {
                    x = fsinput1.ReadByte();
                    if (x == -1)
                    {
                        break;
                    }
                    buf1.Add((byte)x);
                }
            }

            using (FileStream fsinput2 = new FileStream(fileName2, FileMode.Open, FileAccess.Read))
            {
                int y = 0;
                while (true)
                {
                    y = fsinput2.ReadByte();
                    if (y == -1)
                    {
                        break;
                    }
                    buf2.Add((byte)y);
                }
            }
            byte[] datax = buf1.ToArray();
            byte[] datay = buf2.ToArray();

            try
            {
                #region 左右声道混音测试,失败
                //int size = datax.Length > datay.Length ? datax.Length : datay.Length;
                //byte[] mixedbuf = new byte[size];
                //if (datax.Length != datay.Length)
                //{
                //    if (datax.Length > datay.Length)
                //    {
                //        byte[] Ndatay = new byte[datax.Length];
                //        Buffer.BlockCopy(datay, 0, Ndatay, 0, datay.Length);
                //        mixedbuf = MixStereoToMono(datax, Ndatay);
                //    }
                //    else
                //    {
                //        byte[] Ndatax = new byte[datay.Length];
                //        Buffer.BlockCopy(datax, 0, Ndatax, 0, datax.Length);
                //        mixedbuf = MixStereoToMono(Ndatax, datay);
                //    }
                //}
                //else
                //{
                //    mixedbuf = MixStereoToMono(datax, datay);
                //}
                //WaveFormat mf = new WaveFormat(8000, 16, 1);
                //using (WaveFileWriter wf = new WaveFileWriter(fileOutPut, mf))
                //{
                //    wf.Write(mixedbuf, 0, mixedbuf.Length);
                //}
                #endregion

                #region 手动添加Wav Header
                //PCMHeader ph = new PCMHeader();
                //byte[] header1 = ph.GeneratePCMHeader(datax.Length, 1, 8000, 8000, 16, datax.Length + 44);
                //byte[] header2 = ph.GeneratePCMHeader(datay.Length, 1, 8000, 8000, 16, datay.Length + 44);
                //byte[] x = new byte[44 + datax.Length];
                //byte[] y = new byte[44 + datay.Length];

                //Buffer.BlockCopy(header1, 0, x, 0, 44);
                //Buffer.BlockCopy(datax, 0, x, 44, datax.Length);
                //Buffer.BlockCopy(header2, 0, y, 0, 44);
                //Buffer.BlockCopy(datay, 0, y, 44, datay.Length);

                //MemoryStream ms1 = new MemoryStream(x);
                //MemoryStream ms2 = new MemoryStream(y);
                //WaveFileReader wrx = new WaveFileReader(ms1);
                //WaveFileReader wry = new WaveFileReader(ms2);
                #endregion

                MemoryStream            ms1     = new MemoryStream(datax);
                MemoryStream            ms2     = new MemoryStream(datay);
                WaveFormat              mf      = new WaveFormat(8000, 8, 1);
                WaveStream              wrx     = new RawSourceWaveStream(ms1, mf);
                WaveStream              wry     = new RawSourceWaveStream(ms2, mf);
                Pcm8BitToSampleProvider reader1 = new Pcm8BitToSampleProvider(wrx);
                Pcm8BitToSampleProvider reader2 = new Pcm8BitToSampleProvider(wry);
                //Wave16ToFloatProvider wx = new Wave16ToFloatProvider(wrx);
                //Wave16ToFloatProvider wy = new Wave16ToFloatProvider(wry);
                //var reader1 = new WaveToSampleProvider(wx);
                //var reader2 = new WaveToSampleProvider(wy);

                //using (var reader1 = new AudioFileReader(fileName1))                    //ISampleProvider
                //using (var reader2 = new AudioFileReader(fileName2))                    //ISampleProvider
                //{
                var mixer = new MixingSampleProvider(new[] { reader1, reader2 });       //ISampleProvider
                var mm    = new SampleToWaveProvider(mixer);                            //转换
                //WaveFileWriter.CreateWaveFile(fileOutPut, mm);                      //IWaveProvider
                //}

                List <byte> buf = new List <byte>();
                using (WaveProviderToWaveStream ws = new WaveProviderToWaveStream(mm))
                {
                    int m = 0;
                    while (true)
                    {
                        m = ws.ReadByte();
                        if (m == -1)
                        {
                            break;
                        }
                        buf.Add((byte)m);
                    }
                }
                if (buf.Count == 0)
                {
                    return;
                }
                byte[] data = buf.ToArray();


                using (FileStream fs = new FileStream("pcm_" + fileOutPut, FileMode.Create, FileAccess.Write))
                {
                    fs.Write(data, 0, data.Length);
                    fs.Close();
                }
                System.IntPtr ptrSource = Marshal.StringToHGlobalAnsi("pcm_" + fileOutPut);
                System.IntPtr ptrTarget = Marshal.StringToHGlobalAnsi(fileOutPut + ".wav");
                DJCVT.NativeMethods.PcmtoWaveNew(ptrSource, ptrTarget, 2);

                MessageBox.Show("混音成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                txt_inputPath1.Text = string.Empty;
                txt_inputPath2.Text = string.Empty;
                txt_outputPath.Text = string.Empty;
            }
        }