aifc — Чтение и запись файлов AIFF и AIFC


Данный модуль обеспечивает поддержку чтения и записи файлов AIFF и AIFF-C. AIFF — это формат файла обмена аудио, формат для хранения цифровых аудиосэмплов в файле. AIFF-C — это более новая версия формата, которая включает возможность сжатия аудиоданных.

У аудио файлов есть ряд параметров, которые определяют аудиоданные. Частота дискретизации или частота фреймов — это количество дискретизаций звука в секунду. Количество каналов указывает, является ли звук моно, стерео или квадро. Каждый фрейм состоит из одной выборки на канал. Размер выборки — это размер каждой выборки в байтах. Таким образом, фрейм состоит из nchannels * samplesize байтов, а значение секунды звука состоит из nchannels * samplesize * framerate байтов.

Например, у звука с качеством CD размер выборки в два байта (16 бит), используется два канала (стерео) и частота фреймов 44 100 фреймов в секунду. Это даёт размер фрейма 4 байта (2*2), и стоимость секунды занимает 2*2* 44100 байтов (176 400 байтов).

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

aifc.open(file, mode=None)

Открывает файл AIFF или AIFF-C, и возвращает экземпляр объекта с помощью приведенных далее методов. Аргумент file — это либо строка с именем файла, либо файловый объект. mode должен быть 'r' или 'rb', когда файл должен быть открыт для чтения, или 'w' или 'wb', когда файл должен быть открыт для записи. Если пропущено, используется file.mode, если он существует, в противном случае используется 'rb'. При использовании для записи файловый объект должен быть доступен для поиска, если вы заранее не знаете, сколько отсчетов вы собираетесь записать в целом, и используете writeframesraw() и setnframes(). Функцию open() можно использовать в операторе with. Когда блок with завершается, вызывается метод close().

Изменено в версии 3.4: Добавлена поддержка оператора with.

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

aifc.getnchannels()

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

aifc.getsampwidth()

Возвращает размер отдельных выборок в байтах.

aifc.getframerate()

Возвращает частоту дискретизации (количество аудиофреймов в секунду).

aifc.getnframes()

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

aifc.getcomptype()

Возвращает массив байтов длиной 4, определяющий тип сжатия, используемый в аудиофайле. Для файлов AIFF возвращаемое значение — b'NONE'.

aifc.getcompname()

Возвращает массив байтов, конвертируемый в удобочитаемое описание типа сжатия, используемого в аудиофайле. Для файлов AIFF возвращаемое значение — b'not compressed'.

aifc.getparams()

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

aifc.getmarkers()

Возвращает список маркеров в аудиофайл. Маркер состоит из набора из трех элементов. Первый — это идентификатор метки (целое число), второй — позиция метки в кадрах от начала данных (целое число), третий — имя метки (строка).

aifc.getmark(id)

Возвращает кортеж, как приведено в getmarkers() для метки с заданным id.

aifc.readframes(nframes)

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

aifc.rewind()

Перемотать указатель чтения назад. Следующий readframes() начнётся сначала.

aifc.setpos(pos)

Перейти к указанному номеру фрейма.

aifc.tell()

Возвращает текущий номер фрейма.

aifc.close()

Закрыть файл AIFF. После вызова этого метода объект больше не может быть использован.

У объектов, возвращаемых open() при открытии файла для записи, есть все вышеперечисленные методы, за исключением readframes() и setpos(). Кроме того, существуют следующие методы. Методы get*() можно вызывать только после того, как были вызваны соответствующие методы set*(). Перед первым writeframes() или writeframesraw() необходимо заполнить все параметры, кроме количества фреймов.

aifc.aiff()

Создать файл AIFF. По умолчанию создаётся файл AIFF-C, если имя файла не заканчивается на '.aiff', и в этом случае по умолчанию используется файл AIFF.

aifc.aifc()

Создать файл AIFF-C. По умолчанию создаётся файл AIFF-C, если имя файла не заканчивается на '.aiff', и в этом случае по умолчанию используется файл AIFF.

aifc.setnchannels(nchannels)

Указать количество каналов в аудиофайле.

aifc.setsampwidth(width)

Указать размер аудиосэмплов в байтах.

aifc.setframerate(rate)

Указать частоту дискретизации в кадрах в секунду.

aifc.setnframes(nframes)

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

aifc.setcomptype(type, name)

Указать тип сжатия. Если не указано иное, аудиоданные не будут сжиматься. В файлах AIFF сжатие невозможно. Параметр имени должен представлять собой удобочитаемое описание типа сжатия в виде массива байтов, параметр типа должен быть массивом байтов длиной 4. В настоящее время поддерживаются следующие типы сжатия: b'NONE', b'ULAW', b'ALAW', b'G722'.

aifc.setparams(nchannels, sampwidth, framerate, comptype, compname)

Задаёт сразу все вышеперечисленные параметры. Аргумент — это кортеж, состоящий из различных параметров. Это означает, что можно использовать результат вызова getparams() в качестве аргумента для setparams().

aifc.setmark(id, pos, name)

Добавить метку с заданным идентификатором (больше 0) и заданным именем в данной позиции. Данный метод можно вызвать в любое время до close().

aifc.tell()

Возвращает текущую позицию записи в выходной файл. Полезно в сочетании с setmark().

aifc.writeframes(data)

Записать данные в выходной файл. Данный метод можно вызвать только после установки параметров аудиофайла.

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

aifc.writeframesraw(data)

Как writeframes(), за исключением того, что заголовок аудиофайла не обновляется.

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

aifc.close()

Закрыть файл AIFF. Заголовок файла обновляется, чтобы отразить фактический размер аудиоданных. После вызова этого метода объект больше не может быть использован.