WedX - журнал о программировании и компьютерных науках

Скопируйте и обновите содержимое активно записываемого Wav-файла в новый файл.

У меня есть активная аудиозапись в формате WAV с NAudio Library.

    private void RecordStart() {
        try {
            _sourceStream = new WaveIn {
                DeviceNumber = _recordingInstance.InputDeviceIndex,
                WaveFormat =
                    new WaveFormat(
                    44100,
                    WaveIn.GetCapabilities(_recordingInstance.InputDeviceIndex).Channels)
            };

            _sourceStream.DataAvailable += SourceStreamDataAvailable;
            if (!Directory.Exists(_recordingInstance.AudioFilePath)) {
                Directory.CreateDirectory(_recordingInstance.AudioFilePath);
            }

            WaveFileWriter _waveWriter = new WaveFileWriter(
                _recordingInstance.AudioFilePath + _recordingInstance.AudioFileName,
                _sourceStream.WaveFormat);
            _sourceStream.StartRecording();
        } 
        catch (Exception exception) {
            Log.Error("Recording failes", exception);
        }
    }

    private void SourceStreamDataAvailable(object sender, WaveInEventArgs e) {
        if (_waveWriter == null) return;
        _waveWriter.Write(e.Buffer, 0, e.BytesRecorded);
        _waveWriter.Flush();
    }

Я хочу скопировать последний доступный контент в другое место. Скопированный файл должен быть в формате WAV и должен воспроизводиться доступной продолжительности. Обновляйте конечный файл всякий раз, когда доступно больше содержимого.

Я попробовал следующий пример кода (используя NAudio) со статическим файлом WAV, но решение не работает.

  1. Созданный в результате WAV-файл поврежден - не в правильном формате.

    using (WaveFileReader reader = new WaveFileReader(remoteWavFile))
    {
      byte[] buffer = new byte[reader.Length];
      int read = reader.Read(buffer, 0, buffer.Length);           
    }
    
  2. Во время записи код выдает исключение «Файл используется другим приложением».


  • Что значит решение не работает? Он компилируется? Выдает ли это исключение? Это шлепает вашу собаку? Пожалуйста, опишите проблему подробнее. 24.01.2016
  • Я пытался прочитать содержимое в буфер, а затем создать новый файл, используя массив байтов. Он скопировал содержимое и создал файл WAV. Но не удается воспроизвести файл. 25.01.2016
  • Таким образом, ваш второй блок кода показывает, что вы читаете данные из волнового файла, но ничего не делает с этими данными. Где раздел записи? 25.01.2016

Ответы:


1

Я решил проблему с помощью самой библиотеки NAudio.

  1. Когда мы используем только класс WaveFileReader NAudio. Будет выброшено исключение - "файл используется другим приложением". Поэтому мне пришлось создать файловый поток, который открывает исходный файл - файл записи в реальном времени, с File.Open(inPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), а затем передает этот поток в качестве входных данных WaveFileReader.

  2. Затем создайте класс WaveFileWritter NAudio с тем же WavFormat считывателем.

скопированный ниже код, который я использовал.

   public static void CopyWavFile(string inPath, string outPath){
        using (var fs = File.Open(inPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)){
            using (var reader = new WaveFileReader(fs)){
                using (var writer = new WaveFileWriter(outPath, reader.WaveFormat)){
                    reader.Position = 0;
                    var endPos = (int)reader.Length;                        
                    var buffer = new byte[1024];
                    while (reader.Position < endPos){
                        var bytesRequired = (int)(endPos - reader.Position);
                        if (bytesRequired <= 0) continue;
                        var bytesToRead = Math.Min(bytesRequired, buffer.Length);
                        var bytesRead = reader.Read(buffer, 0, bytesToRead);
                        if (bytesRead > 0){
                            writer.Write(buffer, 0, bytesRead);
                        }
                    }
                }
            }         
        }           
    }
25.01.2016
Новые материалы

Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


Для любых предложений по сайту: [email protected]