필수 구성 요소
이 안내는 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의 오디오를 소비합니다. 오디오 끊김을 방지하려면 오디오를 일정한 속도로 제출해야 합니다.
