Содержание страницы
22.4. wave – Чтение и запись WAV-файлов¶wave – Read and write WAV files
Исходный код: Lib/wave.py
Модуль wave предоставляет удобный интерфейс для работы со звуковым форматом WAV. Он не поддерживает сжатие/распаковку, но поддерживает моно/стерео.
Модуль wave определяет следующие функцию и исключение:
- wave.open(file, mode=None)¶
Если file – строка, открывается файл с таким именем, в противном случае он рассматривается как файлоподобный объект. Параметр mode может принимать следующие значения:
- 'rb'
- Режим только для чтения.
- 'wb'
- Режим только для записи.
Обратите внимание: не поддерживаются WAV-файлы, открытые одновременно на чтение и запись.
Режим mode со значением 'rb' возвращает объект Wave_read, а режим mode со значением 'wb' возвращает объект Wave_write. Если mode опущен, а в качестве file передан файлоподобный объект, то по умолчанию для mode используется file.mode.
Если передаётся файлоподобный объект, волновой объект не закроет его при вызове метода close(); вызывающая сторона отвечает за закрытие файлового объекта.
Функция open() может использоваться в операторе with. Когда блок with завершается, вызывается метод Wave_read.close() или Wave_write.close().
Изменено в версии 3.4: Добавлена поддержка файлов без произвольного доступа.
- exception wave.Error¶
Исключение, возникающее, когда какое-либо действие невозможно, поскольку оно нарушает спецификацию WAV или сталкивается с недостатком реализации.
22.4.1. Объекты Wave_read¶Wave_read Objects
Объекты 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 фреймов аудио в виде строки байтов.
- Wave_read.rewind()¶
Перемещает указатель файла в начало аудиопотока.
Следующие два метода определены для совместимости с модулем aifc и не делают ничего интересного.
- Wave_read.getmarkers()¶
Возвращает None.
- Wave_read.getmark(id)¶
Возбуждает исключение.
Следующие два метода определяют термин «позиция», совместимый между ними, а в остальном зависящий от реализации.
- Wave_read.setpos(pos)¶
Устанавливает указатель файла на указанную позицию.
- Wave_read.tell()¶
Возвращает текущую позицию указателя файла.
22.4.2. Объекты Wave_write¶Wave_write Objects
Для выходных потоков с возможностью позиционирования заголовок 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.