マイクを送る
AddTrack は種別とコーデックを取り、TsgcRTCTrack を返します。音声コーデックは cctAudioOpus、cctAudioPCMU、cctAudioPCMA、映像コーデックは cctVideoVP8、cctVideoVP9、cctVideoH264、cctVideoJPEG です。
キャプチャは別のオブジェクトです。プラットフォームのマイクをまったく使いたくない場合もあるからです。sgcCreateAudioCapture は、コンパイル対象のプラットフォームに合った実装を組み立てます。Windows なら waveIn、Linux なら ALSA、Android なら AudioRecord、iOS と macOS なら VoiceProcessingIO Audio Unit です。そのため、コードのどこにもプラットフォーム固有のクラス名は現れません。実装のないターゲットでは nil を返すので、結果を確認してください。
SendPCM は、エンコーダーのレートとチャネル数に合わせた 16 ビット符号付きインターリーブ PCM を要求します。Opus なら 48000 Hz、G.711 なら 8000 Hz です。キャプチャ元は実際に供給している値を AudioSampleRate、AudioChannels、AudioFrameDurationMs で公開しているので、推測せずに確認できます。
セッションが確立した後にトラックを追加すると、再ネゴシエーションが必要というフラグが立ち、OnNegotiationNeeded が発火します。公開するにはもう一度 CreateOffer を呼びます。再オファーはトランスポートに触れずに組み立てられます。
procedure TFormPeer.StartCall;
begin
FPeer.RTCOptions.DTLS := True;
FAudioTrack := FPeer.AddTrack(rtctkAudio, cctAudioOpus);
FVideoTrack := FPeer.AddTrack(rtctkVideo, cctVideoVP8);
FCapture := sgcCreateAudioCapture;
if Assigned(FCapture) then
begin
FCapture.OnAudioCapture := OnAudioCaptured;
FCapture.Start;
if not FCapture.Active then
Log(FCapture.LastError);
end;
FRenderer := sgcCreateAudioRenderer;
if Assigned(FRenderer) then
FRenderer.Start;
FPeer.CreateOffer;
end;
procedure TFormPeer.OnAudioCaptured(Sender: TObject;
const aPCM: TBytes;
aSampleRate, aChannels, aSamplesPerChannel: Integer);
begin
if Assigned(FAudioTrack) then
FAudioTrack.SendPCM(aPCM, aSamplesPerChannel);
end;