wave — Чтение и запись WAV файлов


Модуль wave предоставляет удобный интерфейс для звукового формата WAV. Он не поддерживает сжатие/распаковку, но поддерживает моно/стерео.

Модуль wave определяет следующую функцию и исключение:

wave.open(file, mode=None)

Если file является строкой, открывает файл по имени, иначе обрабатывает его как файлоподобный объект. mode может быть:

'rb'
Режим только для чтения.
'wb'
Только режим записи.

Обратите внимание, что он не позволяет читать/записывать WAV файлы.

mode из 'rb' возвращает объект Wave_read, а mode из 'wb' возвращает объект Wave_write. Если mode пропущен, а файлоподобный объект передаётся как file, file.mode используется как значение по умолчанию для mode.

Если вы передаете файлоподобный объект, wave объект не закроет его при вызове метода close(); ответственность за закрытие файлового объекта лежит на вызывающем объекте.

Функцию open() можно использовать в операторе with. Когда блок with завершается, вызывается метод Wave_read.close() или Wave_write.close().

Изменено в версии 3.4: Добавлена поддержка недоступных для поиска файлов.

wave.openfp(file, mode)

Синоним для open(), поддерживаемый для обратной совместимости.

Устарело с версии 3.7, будет удалено в 3.9 версии..

exception wave.Error

Вызывается ошибка, когда нарушается WAV спецификации или недостатка реализации.

Объекты Wave_read

У объектов Wave_read, возвращенных open(), есть следующие методы:

Wave_read.close()

Закрывает поток, если он был открыт wave, и делает экземпляр непригодным для использования. Вызывается автоматически при сборе объектов.

Wave_read.getnchannels()

Возвращает количество аудиоканалов (1 для моно, 2 для стерео).

Wave_read.getsampwidth()

Возвращает ширину выборки в байтах.

Wave_read.getframerate()

Возвращает частоту дискретизации.

Wave_read.getnframes()

Возвращает количество звуковых фреймов.

Wave_read.getcomptype()

Возвращает тип сжатия (единственный поддерживаемый тип — 'NONE').

Wave_read.getcompname()

Удобочитаемая версия getcomptype(). Обычно 'not compressed' параллелен 'NONE'.

Wave_read.getparams()

Возвращает namedtuple() (nchannels, sampwidth, framerate, nframes, comptype, compname), эквивалентный выходным данным методов get*().

Wave_read.readframes(n)

Считывает и возвращает не более n фреймов аудио в виде объекта bytes.

Wave_read.rewind()

Перематывает указатель файла на начало аудиопотока.

Следующие два метода определены для совместимости с модулем aifc и не делают ничего интересного.

Wave_read.getmarkers()

Возвращает None.

Wave_read.getmark(id)

Вызывает ошибку.

Следующие два метода определяют термин «позиция», который совместим между ними и в остальном зависит от реализации.

Wave_read.setpos(pos)

Устанавливает указатель файла в указанную позицию.

Wave_read.tell()

Возвращает текущую позицию указателя файла.

Объекты Wave_write

Для доступных для поиска выходных потоков заголовок wave будет автоматически обновлен, чтобы отразить количество фактически записанных фреймов. Для потоков без поиска значение nframes должно быть точным при записи данных первого фрейма. Точное значение nframes может быть получено либо вызовом setnframes() или setparams() с количеством фреймов, которые будут записаны до вызова close(), а затем использованием writeframesraw() для записи данных фрейма, либо вызовом writeframes() со всеми данными фрейма, подлежащими записи. В последнем случае writeframes() рассчитает количество фреймов в данных и соответственно установит nframes перед записью данных фрейма.

У объектов Wave_write, возвращенных open(), есть следующие методы:

Изменено в версии 3.4: Добавлена поддержка недоступных для поиска файлов.

Wave_write.close()

Проверяет, что nframes указан правильно, и закрывает файл, если он был открыт wave. Данный метод вызывается при сборе объектов. Вызовет исключение, если выходной поток не доступен для поиска и nframes не соответствует количеству фактически записанных фреймов.

Wave_write.setnchannels(n)

Устанавливает количество каналов.

Wave_write.setsampwidth(n)

Устанавливает ширину выборки на n байт.

Wave_write.setframerate(n)

Устанавливает частоту фреймов на n.

Изменено в версии 3.2: Нецелые входные данные для метода округляются до ближайшего целого числа.

Wave_write.setnframes(n)

Устанавливает количество фреймов на n. Будет изменен позже, если количество фактически записанных фреймов отличается (попытка обновления вызовет ошибку, если выходной поток недоступен для поиска).

Wave_write.setcomptype(type, name)

Устанавливает тип сжатия и описание. На данный момент поддерживается только тип сжатия NONE, что означает отсутствие сжатия.

Wave_write.setparams(tuple)

tuple должен быть (nchannels, sampwidth, framerate, nframes, comptype, compname) со значениями, допустимыми для методов set*(). Устанавливает все параметры.

Wave_write.tell()

Возвращает текущую позицию в файле с тем же отказом от ответственности для методов Wave_read.tell() и Wave_read.setpos().

Wave_write.writeframesraw(data)

Записывает аудио фреймы, не исправляя nframes.

Изменено в версии 3.4: Теперь принимается любой байтоподобный объект.

Wave_write.writeframes(data)

Записывает аудиокадры и проверяет, что nframes правильный. Вызовет ошибку, если выходной поток не доступен для поиска, а общее количество фреймов, которые были записаны после записи data, не соответствует ранее установленному значению для nframes.

Изменено в версии 3.4: Теперь принимается любой байтоподобный объект.

Обратите внимание, что нельзя задавать какие-либо параметры после вызова writeframes() или writeframesraw(), и любая попытка сделать это вызовет wave.Error.