Skip to main content
이 항목에서는 하드웨어 가속 Opus 파일 디코딩 및 고품질 샘플 레이트 변환을 위한 XAPU API의 개요를 제공합니다.

Opus 하드웨어 디코딩 릴리스 기능

역사적으로 XBOX One 콘솔 제품군에서 하드웨어 오프로드 디코딩을 제공한 것은 XMA뿐이었습니다. 이제 XBOX Series X|S 세대 콘솔에서는 XAPU(XBOX Audio Processing Unit) API를 통해 Opus 하드웨어 오프로드 디코딩을 도입합니다. Opus는 음성과 일반 오디오를 단일 형식으로 효율적으로 코딩하도록 설계된 로열티 프리 오디오 압축 코덱입니다. Opus는 저지연입니다. 내부 평가에서 Opus는 품질과 파일 크기 압축률 모두에서 XMA를 능가합니다. 추가로, 하드웨어 디코딩 기능(Opus)과 함께 작동하는 High-quality Sample Rate Convertor(HSRC)가 추가되었습니다. Opus 하드웨어 오프로드 디코딩과 피치를 변경하는 HSRC 기능을 결합하면, 개발자는 이전 세대의 SHAPE 제공물보다 향상된 출력 품질을 확인할 수 있습니다. (이는 XBOX Series X|S 콘솔에서 이전 버전 호환성을 위해 여전히 지원됩니다.)

이번 릴리스의 새로운 사항

  • June FAL QFE3의 새 기능: Quick Resume 시나리오의 경우, 재개 후 타이틀이 하드웨어와의 연결을 재설정할 필요가 더 이상 없습니다.
  • June FAL QFE4의 새 기능: CELT에 대해 2.5ms 및 5ms 길이의 Opus 패킷이 이제 지원됩니다.
  • 2020년 8월 Preview Recovery 버전 10.0.19041.4124(rs_xbox_release_2008- 19041.4124.200814-0000) / 10.0.19041.3562(rs_xbox_release_sirius- 19041.3562.200814-2300) 이상: XApuDecodeConvertCommand 구현에 대한 Breaking Change: 이제 firstFrameIndex를 사용할 때 잔여 데이터가 포함되지 않았지만 이전에는 포함되었습니다. 자세한 내용은 Best Practice 섹션이나 API 참조 페이지 XApuDecodeConvertCommand를 참고하십시오.
  • HSRC 출력 처리 버퍼에 데이터가 있고 flush 명령이 사용된 경우, 이전에는 데이터 손실이 있었습니다(변환된 오디오 데이터 일부를 잃을 수 있으며 출력이 예상대로 되지 않을 수 있음).
  • 지원되지 않는 Opus 패킷이 처리를 위해 전송되면 이제 hang이 아닌 오류가 발생합니다. (예: 10ms 또는 20ms만 지원되는 곳에 2.5ms Opus 패킷 전송)
  • FIFO가 기본으로 켜져 있음
  • 전반적인 성능 개선 및 안정화 수정

Opus 하드웨어 디코딩 릴리스 사양

다음 표는 사용 가능한 명령 및 기능을 요약합니다:

HSRC 사용에 대한 중요 참고사항

High-quality Sample Rate Convertor(HSRC)는 주파수 의존적 그룹 지연이 있으며, 10kHz 미만 주파수에서는 약 5프레임 입니다. 샘플 레이트 변환기가 사용되면 예상되는 출력 지연은 5프레임 이며, 호출자가 그에 맞춰 조정할 수 있습니다. 오디오에 미들웨어 솔루션을 사용하고 있다면, 이 지연은 이미 여러분의 타이틀에서 처리되고 있을 수 있습니다.

모범 사례

  • XApuDecodeConvertCommand 구현 관련: XApuDecodeConvertCommand에 전달되는 firstFrameIndex는 PCM 출력 버퍼로 복사될 첫 번째 프레임을 지정합니다. firstFrameIndex와 frameCount는 출력 버퍼로 복사되는 내용을 지정합니다. 이 구현은 firstFrameIndex를 사용할 때 잔여 데이터를 포함하지 않습니다. 잔여 프레임이 100개이고 firstFrameIndex가 50으로 설정되고 frameCount가 200으로 설정된 경우, 디코드된 데이터의 50번째 프레임부터 시작하여 200개의 프레임이 전체 잔여에 추가됩니다. 이는 HSRC로 들어가는 버퍼가 잔여의 원본 100개 프레임에 이어 현재 디코드된 패킷의 50번째 프레임부터 시작하는 200개 프레임이 뒤따르게 됨을 의미합니다.
  • XAPU 클라이언트는 신중하게 생성할 것을 권장합니다. XAPU 클라이언트는 미리(오디오 엔진 리소스 활성화 중) 만들고 게임 수명 내내 계속 사용하는 것이 가장 좋습니다. XApuConnectXAapuDisconnect 호출은 계산상 비용이 큽니다. 다양한 메모리 요구사항을 가진 클라이언트를 자주 생성하고 삭제하면 리소스가 소진될 위험이 있습니다.
  • 루핑 목적으로 XApuCommandType::Reset을 사용할지 여부는 호출자에게 달려 있으며, 출력에 과도 효과가 발생할 수 있습니다. 하지만 XApuCommandType::Reset을 사용할 때는 과도 효과를 피하기 위해 pre-roll 패킷을 제출해야 합니다.
  • 최상의 성능을 위해 20ms 패킷 크기로 인코드된 Opus 스트림을 사용하십시오.
  • 성능 측면에서는 더 많은 클라이언트에 더 적은 스트림을 사용하는 것보다 더 적은 클라이언트에 더 많은 스트림을 사용하는 것이 더 나을 수 있습니다. 예를 들어, 클라이언트당 20개 스트림을 가진 5개의 클라이언트로 총 100개 스트림을 갖는 것이, 클라이언트당 2개 스트림을 가진 50개의 클라이언트와 비교했을 때 성능이 더 좋습니다. 둘 다 100개 스트림을 디코드하는 데 사용할 수 있지만 첫 번째가 더 나은 성능을 보입니다.
  • OPUS_SET_PREDICTION_DISABLED는 패킷 간 예측을 비활성화하며 지원됩니다. 이 플래그로 인코딩하면 압축 성능이 감소하여 디코드된 출력 품질이 저하됩니다.
  • XAPU는 하드웨어 장치가 나쁜 상태일 때 XAPU_E_DEVICE_FATAL 오류를 반환합니다. 이 오류에서 복구하려면 새 클라이언트를 생성하기 전에 모든 XAPU 클라이언트의 연결을 끊어야 합니다.
  • 명령 완료에 대한 신호 메커니즘은 3ms 타이머로 작동하며, 명령이 XApuCommandOptions::SignalOnCompletion 플래그를 얼마나 많이 사용했는지에 관계없이 각 XAPU 클라이언트에 대해 지금까지 완료된 모든 명령에 대해 한 번 신호를 보냅니다.
  • 타이틀이 3ms 신호 메커니즘을 견딜 수 없다면, 루프에서 응답을 찾거나 Sleep(0)을 사용하고 응답을 확인할 수 있습니다.
  • 클라이언트 연결을 끊기 전에 모든 응답을 기다리는 것이 중요합니다. XApuDisconnect는 이제 처리되지 않은 미해결 요청이 있는 경우 XAPU_E_PENDING_RESULTS 오류를 반환합니다. 이 오류는 조치할 수 없으며 개발 시에만 사용해야 합니다. XApuDisconnect는 클라이언트에 할당된 모든 리소스를 해제하며, 하드웨어가 이 클라이언트에 대한 명령을 여전히 처리하는 동안 호출되면 하드웨어가 해제된 메모리에 쓰기 때문에 메모리 손상이 발생할 수 있습니다.
  • 하드웨어에 전달되는 모든 메모리 포인터(예: inputData, outPutData, processingBuffer)는 16바이트 정렬되어야 합니다.
  • ConvertOnly 또는 DecodeConvert 모드를 사용할 때, 더 큰 출력 프레임 카운트 크기가 더 나은 성능을 가져옵니다. decode convert 및 convert 사용 시 지원되는 최대 출력 프레임 크기는 1024입니다.
  • Variable Bit Rate(VBR) 인코딩만 지원됩니다. Constant Bit Rate(CBR) 인코딩은 VBR 인코딩에서 사용되는 중복 패킷보다 효율성이 떨어지고 품질이 나쁜 전이 패킷을 추가하기 때문에 지원되지 않습니다. 따라서 이 패킷 유형과 확장하여 CBR은 지원되지 않습니다.
  • HYBRID 및 SILK의 경우: 10ms 또는 20ms 패킷과 48000Hz 샘플 레이트에서 모노 및 스테레오 Opus 스트림만 지원됩니다.
  • CELT의 경우: 2.5ms, 5ms, 10ms 또는 20ms 패킷과 48000Hz 샘플 레이트에서 모노 및 스테레오 Opus 스트림만 지원됩니다.

타이틀 일시 중지 및 재개

예를 들어 사용자가 Constrained 모드로 전환할 때, 타이틀은 일시 중지하고 재개할 수 있어야 합니다. 일시 중단 핸들러가 호출되면 하드웨어에 XAPU 명령을 제출하는 것을 단순히 중단하십시오. 이미 제출된 명령은 정상적으로 완료되어 해당 응답 큐에 배치됩니다.

샘플(소스 코드는 외부 .zip 파일에서 사용 가능, AnaAud@microsoft.com에 이메일로 요청)

  • Decode One Opus Stream. (이 샘플의 개요는 여기에서 확인할 수 있습니다.)
  • Decode Multi-Opus Streams.
  • Play One Opus Stream. (스레딩은 “Decode One Opus Stream”과 다릅니다.)
  • Play Multi-Opus Streams.
  • Decode Convert One Opus Stream with an option to loop and sample accurate seek.
  • Decode Convert Multi-Opus Streams.
  • Play Decode Convert One Opus Stream.
  • SimpleXAPU (UI가 있는 GDK 타이틀 내 Opus 스트림 디코드 예제.)

연락처

이 기능에 대한 질문이나 우려가 있다면 AnaAud@microsoft.com으로 이메일을 보내거나 온라인 포럼을 이용하십시오.

참조 API 문서

마지막 수정일 2026년 8월 24일