Skip to main content
PlayFab Party는 실시간 네트워킹 및 음성 채팅 솔루션입니다. 음성 채팅용으로 구성된 경우 PlayFab Party는 마이크 오디오를 전송하고 수정 없이 재생합니다. 일부 게임은 공간 오디오나 보이스 필터 같은 사용자 지정 오디오 효과를 구현하기 위해 음성 채팅 오디오 버퍼에 액세스해야 합니다. 이 문서는 PlayFab Party에서 실시간 오디오 조작 기능을 사용하여 음성 채팅 오디오를 가로채고 수정하는 방법에 대한 안내입니다.

필수 구성 요소

이 안내는 PlayFab Party의 음성 채팅에 대한 기본적인 이해가 있다고 가정합니다.

플랫폼 지원

실시간 오디오 조작은 모든 플랫폼에서 사용할 수 있는 것은 아닙니다. 실시간 오디오 조작과 관련된 메서드는 통합된 크로스 플랫폼 헤더에 존재하지만, 현재 Windows, XBOX, PlayStation® 5에만 구현되어 있습니다. 다른 플랫폼에서 이 메서드를 호출하면 오류가 반환됩니다.

오디오 스트림

실시간 오디오 조작은 라이브러리에서 오디오를 검색하거나 라이브러리에 오디오를 제출하는 데 사용되는 오디오 스트림이라는 개념을 도입합니다. 오디오 스트림에는 두 가지 유형이 있습니다. 첫 번째는 **소스 스트림(source stream)**입니다. 소스 스트림은 채팅 컨트롤에서 오디오를 검색하는 데 사용됩니다. 각 채팅 컨트롤은 **음성 스트림(voice stream)**이라 불리는 하나의 소스 스트림만 가질 수 있습니다. 로컬 채팅 컨트롤의 경우 마이크 입력을 검색하는 데 사용되고, 원격 채팅 컨트롤의 경우 수신되는 음성 오디오를 검색하는 데 사용됩니다. 채팅 컨트롤에 음성 스트림이 존재하면, 라이브러리는 해당 채팅 컨트롤의 소스 오디오를 자동으로 처리하는 대신 그 음성 스트림으로 리디렉션합니다. 로컬 채팅 컨트롤의 경우 마이크 오디오를 자동으로 인코딩하고 전송하는 대신 음성 스트림으로 리디렉션한다는 뜻이며, 원격 채팅 컨트롤의 경우 수신되는 음성 오디오를 자동으로 각 로컬 채팅 컨트롤로 제출해 재생하는 대신 음성 스트림으로 리디렉션한다는 뜻입니다. 소스 스트림은 PartyAudioManipulationSourceStream으로 표현됩니다. 두 번째 유형의 스트림은 **싱크 스트림(sink stream)**입니다. 싱크 스트림은 채팅 컨트롤에 오디오를 제출하는 데 사용됩니다. 로컬 채팅 컨트롤만 싱크 스트림을 가질 수 있으며, 각각 두 개를 가질 수 있습니다. 이는 **캡처 스트림(capture stream)**과 **렌더 스트림(render stream)**이라고 합니다. 채팅 컨트롤에 캡처 스트림이 존재하면, 라이브러리는 마이크 대신 캡처 스트림에서 오디오를 가져와 인코딩하고 다른 채팅 컨트롤로 전송합니다. 채팅 컨트롤에 렌더 스트림이 존재하면, 라이브러리는 렌더 스트림에서 오디오를 가져와 원격 채팅 컨트롤로부터 자동으로 재생되는 음성 채팅 오디오에 추가로 재생합니다. 캡처 스트림에 제출된 오디오는 로컬 채팅 컨트롤의 마이크 입력으로 사용되고, 렌더 스트림에 제출된 오디오는 로컬 채팅 컨트롤의 오디오 출력 장치로 재생되거나 “렌더링”됩니다. 싱크 스트림은 PartyAudioManipulationSinkStream으로 표현됩니다.

오디오 스트림 구성

기본적으로 라이브러리는 오디오 검색, 전송, 재생을 처리합니다. 따라서 채팅 컨트롤은 어떠한 오디오 스트림도 없이 생성됩니다. 스트림 구성 메서드(PartyLocalChatControl::ConfigureAudioManipulationCaptureStream(), PartyLocalChatControl::ConfigureAudioManipulationRenderStream(), PartyChatControl::ConfigureAudioManipulationVoiceStream())를 통해 채팅 컨트롤에 하나 이상의 스트림을 만들 수 있습니다. 구성한 스트림은 이후 PartyLocalChatControl::GetAudioManipulationCaptureStream(), PartyLocalChatControl::GetAudioManipulationRenderStream(), PartyChatControl::GetAudioManipulationVoiceStream()을 통해 검색할 수 있습니다. 각 스트림 구성 메서드는 스트림에서 검색하거나 제출할 오디오의 형식을 지정할 수 있게 해줍니다. 지원되는 형식에 대한 자세한 내용은 각 스트림 구성 메서드의 참조 설명서를 참조하세요.

소스 스트림에서 오디오 검색

PartyAudioManipulationSourceStream::GetNextBuffer()를 통해 소스 스트림에서 오디오를 검색할 수 있습니다. 음성 활동이 감지되면 대략 40ms마다 새 버퍼가 사용 가능해집니다. 사용 가능한 버퍼가 없으면 호출은 성공하고 길이가 0인 버퍼를 제공합니다. 즉시 사용 가능한 버퍼의 총 수는 PartyAudioManipulationSourceStream::GetAvailableBufferCount()를 통해 검색할 수 있습니다. 효율성을 위해 GetNextBuffer()는 버퍼 전체를 복사하는 대신 라이브러리의 메모리를 가리키는 버퍼를 제공합니다. 원할 경우 in-place로 수정할 수 있습니다. 버퍼 처리가 끝나면 라이브러리가 메모리를 회수할 수 있도록 PartyAudioManipulationSourceStream::ReturnBuffer()를 통해 버퍼를 해제해야 합니다. 버퍼를 하나도 반환하지 않은 채 여러 버퍼를 검색할 수 있으며, 버퍼는 검색된 순서대로 반환할 필요는 없습니다.

싱크 스트림에 오디오 제출

PartyAudioManipulationSinkStream::SubmitBuffer()를 통해 싱크 스트림에 오디오를 제출할 수 있습니다. 버퍼는 라이브러리에 의해 복사되며 호출이 완료된 후 즉시 해제할 수 있습니다. 라이브러리는 40ms마다 싱크 스트림에 제출된 40ms의 오디오를 소비합니다. 오디오 끊김을 방지하려면 오디오를 일정한 속도로 제출해야 합니다.

시나리오

마이크 오디오 조작(pre-encode buffer manipulation)

마이크 오디오 조작이란 다른 채팅 컨트롤로 전송되기 전에 마이크 오디오를 가로채고 변경하는 것을 말합니다. 이는 마이크 오디오가 인코딩되고 다른 채팅 컨트롤로 전송되기 전에 수정되므로 “pre-encode buffer manipulation”이라고도 불립니다. 로컬 채팅 컨트롤에 대해 이 시나리오를 구현하려면 먼저 로컬 채팅 컨트롤에 대한 음성 스트림과 캡처 스트림을 구성합니다. 구성 후에 단일 채팅 컨트롤의 마이크 오디오를 처리하기 위해 전용 오디오 스레드의 각 틱에서 호출되는 함수는 다음과 같이 보일 수 있습니다.

원격 오디오 조작(post-decode buffer manipulation)

원격 오디오 조작이란 수신되는 오디오가 각 로컬 채팅 컨트롤로 렌더링되기 전에 가로채서 변경하는 것을 말합니다. 이는 수신되는 오디오가 디코딩된 후 렌더링되기 전에 수정되므로 “post-decode buffer manipulation”이라고도 불립니다. 이 시나리오를 구현하려면 먼저 각 원격 채팅 컨트롤에 대한 음성 스트림과 각 로컬 채팅 컨트롤에 대한 렌더 스트림을 구성합니다. 그런 다음 오디오 스레드의 각 틱마다 각 음성 스트림에서 오디오를 가져오고, 필요에 따라 효과를 적용하면서 오디오를 단일 스트림으로 믹싱한 다음, 각 렌더 스트림에 믹싱된 버퍼를 제출해야 합니다. 게임 시나리오에 따라 각 로컬 채팅 컨트롤에 대해 서로 다른 스트림으로 버퍼를 믹싱해야 할 수도 있습니다. 수신되는 음성 오디오를 처리하기 위해 전용 오디오 스레드의 각 틱마다 호출되는 함수는 다음과 같을 수 있습니다.

프라이버시 및 믹싱 고려 사항

원격 채팅 컨트롤이 오디오를 생성하고 채팅 권한음소거 구성이 최소한 하나의 로컬 채팅 컨트롤에서 오디오 재생을 허용하는 한, 라이브러리는 원격 채팅 컨트롤의 음성 스트림을 통해 오디오를 제공합니다. 오디오가 한 로컬 채팅 컨트롤에는 재생되어야 하지만 다른 채팅 컨트롤에는 재생되지 않아야 하는 경우, 후자의 채팅 컨트롤에 대한 오디오 믹스에서 이를 제외해야 합니다.

채팅 표시기 고려 사항

원격 채팅 컨트롤에 대해 음성 스트림을 구성해도 그 채팅 표시기에는 영향을 미치지 않습니다. 채팅 표시기와 여러분의 믹싱 로직 간의 차이를 조정하여 올바른 UI 표시기를 선택하는 로직을 구현해야 할 수 있습니다. 예를 들어, 채팅 표시기는 채팅 컨트롤이 말하고 있음을 나타낼 수 있지만 사용자 지정 믹싱 로직이 오디오를 드롭하기로 선택할 수도 있습니다.

혼합 시나리오

일부 시나리오에서는 일부 채팅 컨트롤에 대해서만 오디오 조작을 활성화하고 다른 채팅 컨트롤에는 활성화하지 않을 수 있습니다. 예를 들어, 경기 중에 만나는 상대 팀 플레이어에게는 효과를 적용하고 같은 팀 플레이어에게는 적용하지 않을 수 있습니다. 이러한 시나리오에서는 오디오 효과를 적용하려는 채팅 컨트롤에만 음성 스트림을 구성하면서 원격 오디오 조작에 대해 앞서 설명한 단계를 따를 수 있습니다. 나머지 원격 채팅 컨트롤의 오디오는 음소거 및 권한 구성이 허용하는 한 자동으로 로컬 채팅 컨트롤로 렌더링됩니다.
마지막 수정일 2026년 8월 24일