[c++] Opus 라이브러리와 오디오 디코딩

Opus는 무손실 및 손실 압축 오디오 코덱으로, WebRTC, VoIP, 온라인 게임 등 다양한 애플리케이션에서 사용됩니다. 이 라이브러리는 오디오 스트리밍 및 실시간 음성 통화를 지원하는 데 유용합니다. C++로 Opus 라이브러리를 사용하여 오디오를 디코딩하는 방법을 살펴보겠습니다.

Opus 라이브러리 설치

Opus 라이브러리를 사용하려면 먼저 해당 라이브러리를 시스템에 설치해야 합니다. 대부분의 리눅스 배포판은 패키지 매니저를 통해 Opus 라이브러리를 설치할 수 있습니다.

sudo apt-get install libopus-dev   # Debian/Ubuntu
sudo yum install opus-devel         # CentOS/Fedora

Windows에서는 Opus의 공식 웹사이트(https://opus-codec.org/)에서 프리빌드된 라이브러리를 다운로드하고 설치할 수 있습니다.

Opus 라이브러리를 이용한 오디오 디코딩

Opus 라이브러리는 오디오 스트림을 디코딩하기 위한 함수를 제공합니다. 아래는 C++에서 Opus 라이브러리를 사용하여 오디오 파일을 디코딩하는 예제 코드입니다.

extern "C" {
  #include <opus/opus.h>
}

#include <iostream>
#include <fstream>
#include <vector>

int main() {
  int error;
  OpusDecoder* decoder = opus_decoder_create(48000, 2, &error);
  const int MAX_FRAME_SIZE = 960;
  std::vector<unsigned char> inBuffer(2048);
  std::vector<opus_int16> outBuffer(MAX_FRAME_SIZE * 2);

  std::ifstream inputFile("audio.opus", std::ios::binary);
  std::ofstream outputFile("output.pcm", std::ios::binary);

  while (!inputFile.eof()) {
    inputFile.read(reinterpret_cast<char*>(inBuffer.data()), inBuffer.size());
    if (inputFile.gcount() > 0) {
      int frameSize = opus_decode(decoder, inBuffer.data(), inputFile.gcount(), outBuffer.data(), MAX_FRAME_SIZE, 0);
      outputFile.write(reinterpret_cast<const char*>(outBuffer.data()), frameSize * 2 * sizeof(opus_int16));
    }
  }

  opus_decoder_destroy(decoder);
  return 0;
}

위의 코드는 Opus 라이브러리를 사용하여 “audio.opus” 파일을 디코딩하고, “output.pcm” 파일에 저장하는 예제입니다.

Opus 라이브러리를 사용하여 오디오를 디코딩하는 방법에 대한 간단한 예제를 살펴보았습니다. Opus 라이브러리를 통해 오디오 스트림을 디코딩하고, 이를 활용하여 여러 응용 프로그램에서 고음질 오디오를 처리할 수 있습니다.

참고 자료

위의 예제 코드는 Opus 라이브러리 공식 문서 및 예제 코드를 참고하여 작성되었습니다.