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); } } } }
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); } } } }
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); } }
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, }); } }
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); } }
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); }