コード例 #1
0
        public static Stream ConvertWavToMp3(Stream wavStream)
        {
            _uniqueTempFileCounter += 1;
            var tempFile = Path.GetTempFileName();

            using (var rdr = new WaveFileReader(wavStream))
            {
                if (rdr.WaveFormat.BitsPerSample == 24)                                                           //Can't go from 24 bits wav to mp3 directly, create temporary 16 bit wav
                {
                    ISampleProvider sampleprovider = new Pcm24BitToSampleProvider(rdr);                           //24 bit to sample
                    var             resampler      = new WdlResamplingSampleProvider(sampleprovider, SampleRate); //sample to new sample rate
                    WaveFileWriter.CreateWaveFile16(tempFile, resampler);                                         //sample to actual wave file
                    return(ConvertWavFileToMp3MemoryStream(tempFile, true));                                      //file to mp3 bytes
                }
                else if (!SupportedMPEGSampleRates.Contains(rdr.WaveFormat.SampleRate))                           //Can't go from unsupported Sample Rate wav to mp3 directly
                {
                    var resampler = new WdlResamplingSampleProvider(rdr.ToSampleProvider(), SampleRate);          //sample to new sample rate
                    WaveFileWriter.CreateWaveFile16(tempFile, resampler);                                         //sample to actual wave file
                    return(ConvertWavFileToMp3MemoryStream(tempFile, true));                                      //file to mp3 bytes
                }
                else
                {
                    var retMs = FilesystemUtils.recyclableMemoryStreamManager.GetStream();
                    using (var wtr = new LameMP3FileWriter(retMs, rdr.WaveFormat, BitRate))
                    {
                        rdr.CopyTo(wtr);
                        return(retMs);
                    }
                }
            }
        }
コード例 #2
0
        public static Stream ConvertAiffToMp3(Stream aiffStream, string directory)
        {
            _uniqueTempFileCounter += 1;
            var tempFile = Path.GetTempFileName();

            using (var rdr = new AiffFileReader(aiffStream))
            {
                //can't go from 24 bits aif to mp3 directly, create temporary 16 bit wav
                if (rdr.WaveFormat.BitsPerSample == 24)
                {
                    ISampleProvider sampleprovider = new Pcm24BitToSampleProvider(rdr);                           //24 bit to sample
                    var             resampler      = new WdlResamplingSampleProvider(sampleprovider, SampleRate); //sample to new sample rate
                    WaveFileWriter.CreateWaveFile16(tempFile, resampler);                                         //sample to actual wave file
                    return(ConvertWavFileToMp3MemoryStream(tempFile, true));                                      //file to mp3 bytes
                }
                else
                {
                    var retMs = FilesystemUtils.recyclableMemoryStreamManager.GetStream();
                    using (var wtr = new LameMP3FileWriter(retMs, rdr.WaveFormat, BitRate))
                    {
                        rdr.CopyTo(wtr);
                        return(retMs);
                    }
                }
            }
        }
コード例 #3
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);
            }
        }
コード例 #4
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,
                });
            }
        }
コード例 #5
0
ファイル: SampleSource.cs プロジェクト: chuppe/NAudio
 public static SampleSource CreateFromWaveFile(string fileName)
 {
     using (var reader = new WaveFileReader(fileName))
     {
         ISampleProvider sp;
         int             sourceSamples;
         if (reader.WaveFormat.Encoding == WaveFormatEncoding.Pcm)
         {
             if (reader.WaveFormat.BitsPerSample == 16)
             {
                 sp            = new Pcm16BitToSampleProvider(reader);
                 sourceSamples = (int)(reader.Length / 2);
             }
             else if (reader.WaveFormat.BitsPerSample == 24)
             {
                 sp            = new Pcm24BitToSampleProvider(reader);
                 sourceSamples = (int)(reader.Length / 3);
             }
             else
             {
                 throw new ArgumentException("Currently only 16 or 24 bit PCM samples are supported");
             }
         }
         else if (reader.WaveFormat.Encoding == WaveFormatEncoding.IeeeFloat)
         {
             sp            = new WaveToSampleProvider(reader);
             sourceSamples = (int)(reader.Length / 4);
         }
         else
         {
             throw new ArgumentException("Must be PCM or IEEE float");
         }
         float[] sampleData = new float[sourceSamples];
         int     n          = sp.Read(sampleData, 0, sourceSamples);
         if (n != sourceSamples)
         {
             throw new InvalidOperationException(String.Format("Couldn't read the whole sample, expected {0} samples, got {1}", n, sourceSamples));
         }
         SampleSource ss = new SampleSource(sampleData, sp.WaveFormat);
         return(ss);
     }
 }
コード例 #6
0
        public static bool ConvertAiffToMp3(byte[] aiffFile, string directory, out byte[] mp3Bytes)
        {
            mp3Bytes = null;
            try
            {
                _uniqueTempFileCounter += 1;
                var tempFile = Path.Combine(directory, "tempdata" + _uniqueTempFileCounter + ".wav");

                using (var ms = new MemoryStream(aiffFile))
                    using (var rdr = new AiffFileReader(ms))
                    {
                        if (rdr.WaveFormat.BitsPerSample == 24)
                        //can't go from 24 bits aif to mp3 directly, create temporary 16 bit wav
                        {
                            ISampleProvider sampleprovider = new Pcm24BitToSampleProvider(rdr); //24 bit to sample
                            var             resampler      = new WdlResamplingSampleProvider(sampleprovider, SampleRate);
                            //sample to new sample rate
                            WaveFileWriter.CreateWaveFile16(tempFile, resampler); //sample to actual wave file
                            mp3Bytes = ConvertWavToMp3(tempFile, true);           //file to mp3 bytes
                        }
                        else
                        {
                            using (var retMs = new MemoryStream())
                                using (var wtr = new LameMP3FileWriter(retMs, rdr.WaveFormat, BitRate))
                                {
                                    rdr.CopyTo(wtr);
                                    mp3Bytes = retMs.ToArray();
                                }
                        }
                    }
                return(true);
            }
            catch (Exception)
            {
                // ignored
            }
            return(false);
        }