Запись звука напрямую в WAV файл с помощью bass.dll

Ни для кого не секрет, что библиотека bass.dll может не только воспроизводить, но и записывать звук.

Единственная проблема, запись возможна только в поток. Например, TMemoryStream, как в демонстрационном примере RecordTest из комплекта поставки.

Для того чтобы сохранить записанные аудиоданные в файл необходимо перенести данные из потока на жёсткий диск компьютера или карту памяти.

Эта задача сама по себе не представляет особой сложности. Дело в том, что предлагаемый в примере TMemoryStream имеет метод SaveToFile, который сохраняет в файл его содержимое.

Таким образом, чтобы реализовать возможность сохранения записанных данных в файл, по сути, достаточно одной строки кода.

Однако, это не единственный способ. Существует ещё одна недокументированная возможность сохранить в файл записанную звуковую информацию.

Речь идёт о прямой записи в файл с использованием TFileStream или файлового потока.

При таком подходе получаемые звуковые данные сразу же записываются в файл без промежуточного накопления в памяти, как в случае TMemoryStream.

Рассмотрим программную реализацию этого подхода.

В начале, как и при записи с использованием TMemoryStream, опишем запись для заголовка WAV данных.

Более подробную информацию о его структуре и назначении его элементов можно получить в описании формата WAV. При записи в файл первостепенную роль будет играть его последний элемент dwDataLen, который хранит продолжительность записи.

После этого задекларируем две переменные. Первая будет хранить информацию заголовка WAV, а вторая поток записываемых звуковых данных.

И выполним при запуске программы (желательно) инициализацию библиотеки bass.dll для записи.

Далее объявим в классе формы открытое поле типа TFileStream.

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

Для того чтобы начать запись нужно инициализировать файловый поток с правами на запись.

Затем сформировать и записать в него заголовок

Так как продолжительность записи заранее неизвестна, присвоим элементу dwDataLen значение «0».

После этого можно запустить процесс записи.

По завершении записи вычисляем её продолжительность и записываем в элемент dwDataLen заголовка (иначе файл не будет воспроизводиться) и освобождаем поток.

Если всё сделано правильно, по указанному адресу можно будет найти файл .wav со звукозаписью и прослушать её.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *