private static void DecodeAudio(string filename) { FFmpegReader reader = new FFmpegReader(filename, Type.Audio); Console.WriteLine("length {0}, frame_size {1}, sample_rate {2}, sample_size {3}, channels {4}", reader.AudioOutputConfig.length, reader.AudioOutputConfig.frame_size, reader.AudioOutputConfig.format.sample_rate, reader.AudioOutputConfig.format.sample_size, reader.AudioOutputConfig.format.channels); int sampleBlockSize = reader.AudioOutputConfig.format.channels * reader.AudioOutputConfig.format.sample_size; int output_buffer_size = reader.AudioOutputConfig.frame_size * reader.AudioOutputConfig.format.channels * reader.AudioOutputConfig.format.sample_size; byte[] output_buffer = new byte[output_buffer_size]; int samplesRead; long timestamp; Type type; MemoryStream ms = new MemoryStream(); // read full stream while ((samplesRead = reader.ReadFrame(out timestamp, output_buffer, output_buffer_size, out type)) > 0) { Console.WriteLine("read " + samplesRead + " @ " + timestamp); // read samples into memory int bytesRead = samplesRead * sampleBlockSize; ms.Write(output_buffer, 0, bytesRead); } // seek back to start reader.Seek(0, Type.Audio); // read again (output should be the same as above) while ((samplesRead = reader.ReadFrame(out timestamp, output_buffer, output_buffer_size, out type)) > 0) { Console.WriteLine("read " + samplesRead + " @ " + timestamp); } reader.Dispose(); // write memory to wav file ms.Position = 0; MemorySourceStream mss = new MemorySourceStream(ms, new AudioProperties( reader.AudioOutputConfig.format.channels, reader.AudioOutputConfig.format.sample_rate, reader.AudioOutputConfig.format.sample_size * 8, reader.AudioOutputConfig.format.sample_size == 4 ? AudioFormat.IEEE : AudioFormat.LPCM)); IeeeStream ieee = new IeeeStream(mss); NAudioSinkStream nAudioSink = new NAudioSinkStream(ieee); WaveFileWriter.CreateWaveFile(filename + ".ffmpeg.wav", nAudioSink); }
private void SaveToFile(IAudioStream fileOutputStream, System.IO.FileInfo outputFile, IProgressReporter progressReporter) { Pause(); // playback and saving cannot happen in parallel Stopwatch sw = new Stopwatch(); sw.Start(); // save current position for later var currentTime = CurrentTime; // disable reporting to consumers (e.g. GUI) audioVolumeMeteringStream.Disabled = dataMonitorStream.Disabled = true; // set to start for all audio to be saved fileOutputStream.Position = 0; NAudioSinkStream nAudioSink = new NAudioSinkStream(fileOutputStream); long total = nAudioSink.Length; long progress = 0; using (WaveFileWriter writer = new WaveFileWriter(outputFile.FullName, nAudioSink.WaveFormat)) { byte[] buffer = new byte[nAudioSink.WaveFormat.AverageBytesPerSecond * 5]; while (true) { int bytesRead = nAudioSink.Read(buffer, 0, buffer.Length); progress += bytesRead; if (bytesRead == 0) { // end of stream reached break; } writer.Write(buffer, 0, bytesRead); if (progressReporter != null) { progressReporter.ReportProgress((double)progress / total * 100); } } } // reenable reporting to consumers audioVolumeMeteringStream.Disabled = dataMonitorStream.Disabled = false; // reset initial position CurrentTime = currentTime; sw.Stop(); Console.WriteLine("Export time: " + sw.Elapsed); }
private void Window_Loaded(object sender, RoutedEventArgs e) { audioOutput = new WasapiOut(global::NAudio.CoreAudioApi.AudioClientShareMode.Shared, true, 10); mixer = new MixerStream(2, 44100); MonoStream mono = new MonoStream(mixer); Streams.ResamplingStream resampler = new Streams.ResamplingStream(mono, ResamplingQuality.VariableRate, 44100); NAudioSinkStream naudioSink = new NAudioSinkStream(resampler); audioOutput.Init(naudioSink); mixingSampleRateLabel.Content = mixer.Properties.SampleRate; playbackSampleRateLabel.Content = audioOutput.OutputWaveFormat.SampleRate; sliderSampleRate.ValueChanged += new RoutedPropertyChangedEventHandler <double>(delegate(object s2, RoutedPropertyChangedEventArgs <double> e2) { if (resampler.CheckTargetSampleRate(sliderSampleRate.Value)) { resampler.TargetSampleRate = sliderSampleRate.Value; } }); }
private void button1_Click(object sender, RoutedEventArgs e) { Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); dlg.DefaultExt = ".wav"; dlg.Filter = "Wave files|*.wav"; if (dlg.ShowDialog() == true) { WaveFileReader reader = new WaveFileReader(dlg.FileName); NAudioSourceStream nAudioSource = new NAudioSourceStream(reader); IeeeStream ieee = new IeeeStream(nAudioSource); MonoStream mono = new MonoStream(ieee); ResamplingStream res = new ResamplingStream(mono, ResamplingQuality.Medium, 22050); NAudioSinkStream nAudioSink = new NAudioSinkStream(res); WaveFileWriter.CreateWaveFile(dlg.FileName + ".processed.wav", nAudioSink); } }