Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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;
                }
            });
        }
Exemplo n.º 4
0
        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);
            }
        }