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

소스 코드: Lib/aifc.py

이 모듈은 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 파일을 닫습니다. 파일의 헤더는 오디오 데이터의 실제 크기를 반영하도록 갱신됩니다. 이 메서드를 호출한 후에는, 객체를 더는 사용할 수 없습니다.