# `aifc` — AIFF와 AIFC 파일 읽고 쓰기

소스 코드: Lib/aifc.py

Deprecated since version 3.11, will be removed in version 3.13: The `aifc` module is deprecated (see PEP 594 for details).

이 모듈은 AIFF와 AIFF-C 파일을 읽고 쓸 수 있도록 지원합니다. AIFF는 디지털 오디오 샘플을 파일에 저장하는 형식인 Audio Interchange File Format입니다. AIFF-C는 오디오 데이터를 압축하는 기능을 포함하는 이 형식의 새 버전입니다.

오디오 파일에는 오디오 데이터를 설명하는 많은 파라미터가 있습니다. 샘플링 속도나 프레임 속도는 음향을 샘플링하는 초당 횟수입니다. 채널 수는 오디오가 모노(mono), 스테레오(stereo) 또는 쿼드로(quadro)인지를 나타냅니다. 각 프레임은 채널 당 하나의 샘플로 구성됩니다. 샘플 크기는 각 샘플의 크기를 바이트로 표현한 것입니다. 따라서 프레임은 `nchannels * samplesize` 바이트로 구성되고, 1초 분량의 오디오는 `nchannels * samplesize * framerate` 바이트로 구성됩니다.

예를 들어, CD 품질 오디오는 샘플 크기가 2바이트 (16비트)이고, 2채널(스테레오)을 사용하며 프레임 속도가 44,100프레임/초입니다. 이는 4바이트(2*2)의 프레임 크기를 제공하고, 1초 분량의 오디오는 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()`를 사용하지 않는 한 파일 객체는 위치 변경할 수 있어야(seekable) 합니다. `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()

  `get*()` 메서드의 결과와 동등한, `namedtuple()` `(nchannels, sampwidth, framerate, nframes, comptype, compname)`을 반환합니다.

aifc.getmarkers()

  오디오 파일의 마커(marker) 리스트를 반환합니다. 마커는 세 요소의 튜플로 구성됩니다. 첫 번째는 마크 ID(정수)이고, 두 번째는 데이터 시작부터 따진 프레임에서의 마크 위치이며 (정수), 세 번째는 마크의 이름입니다 (문자열).

aifc.getmark(id)

  지정된 id를 가진 마크에 대해 `getmarkers()`에 설명된 튜플을 반환합니다.

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 파일에서, 압축은 불가능합니다. name 매개 변수는 사람이 읽을 수 있는 압축 유형 설명을 바이트열로 제공해야 하며, type 매개 변수는 길이가 4인 바이트열이어야 합니다. 현재 다음 압축 유형이 지원됩니다: `b'NONE'`, `b'ULAW'`, `b'ALAW'`, `b'G722'`.

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

  위의 모든 파라미터를 한 번에 설정합니다. 인자는 여러 파라미터로 구성된 튜플입니다. 이것은 `getparams()` 호출의 결과를 `setparams()`의 인자로 사용할 수 있음을 뜻합니다.

aifc.setmark(id, pos, name)

  지정된 id(0보다 큰 값)의 마크를 주어진 name으로 주어진 위치에 추가합니다. 이 메서드는 `close()` 이전에 언제든지 호출할 수 있습니다.

aifc.tell()

  출력 파일의 현재 쓰기 위치를 반환합니다. `setmark()`와 함께 사용하면 유용합니다.

aifc.writeframes(data)

  데이터를 출력 파일에 씁니다. 이 메서드는 오디오 파일 파라미터가 설정된 후에만 호출할 수 있습니다.

  버전 3.4에서 변경: 이제 모든 바이트열류 객체가 허용됩니다.

aifc.writeframesraw(data)

  오디오 파일의 헤더가 갱신되지 않는다는 점을 제외하고는, `writeframes()`와 같습니다.

  버전 3.4에서 변경: 이제 모든 바이트열류 객체가 허용됩니다.

aifc.close()

  AIFF 파일을 닫습니다. 파일의 헤더는 오디오 데이터의 실제 크기를 반영하도록 갱신됩니다. 이 메서드를 호출한 후에는, 객체를 더는 사용할 수 없습니다.