Explanation:
My Video calls are suffering bad performance, freezing, delay and jitter. I have attached 2 files of Audio and Video data from a 5 minute video call. This uses stun.l.google.com:19302
stun server.
Data:
Notice the framerate = 9 at certain points and drops lower sometimes ( 3-5 fps for > 30 seconds ). Each datapoint was recorded every 10 seconds.
[
{ timestamp: 1593832587553 },
{ googFirsSent: '0' },
{ googCodecName: 'VP9' },
{ googPlisSent: '0' },
{ googFrameHeightReceived: '320' },
{ googJitterBufferMs: '89' },
{ googInterframeDelayMax: '302' },
{ googTrackId: '9fb6208c-db3d-43fc-84f5-c639b9acd469' },
{ packetsReceived: '28875' },
{ googCaptureStartNtpTimeMs: '3802820918669' },
{ googFrameRateOutput: '9' },
{ googTargetDelayMs: '2338' },
{ googFrameRateDecoded: '12' },
{ googFrameRateReceived: '15' },
{ googDecodeMs: '4' },
{ googMinPlayoutDelayMs: '2338' },
{ googCurrentDelayMs: '2148' },
{ googMaxDecodeMs: '6' },
{ mediaType: 'video' },
{ googRenderDelayMs: '10' },
{ transportId: 'Channel-audio-1' },
{ qpSum: '394946' },
{ googContentType: 'realtime' },
{ googNacksSent: '24' },
{ codecImplementationName: 'libvpx' },
{ framesDecoded: '9355' },
{ ssrc: '1775136387' },
{ bytesReceived: '29067646' },
{ packetsLost: '63' },
{ googFirstFrameReceivedToDecodedMs: '16' },
{ googFrameWidthReceived: '180' },
],
I am using Wazo-Platform hosted in AWS on a t2.small
EC2 Instance. Following default configuration via docs.
The Back-End uses:
- Wazo-Platform (latest) hosted on AWS
- stun.l.google.com:19302 Stun Server
The Front-End uses:
- React-Native (latest)
- Wazo-JS-SDK (latest)
- React-Native-WebRTC (latest)
- React-Native-Callkeep (latest)
Code:
Wazo.Phone.on(Wazo.Phone.ON_CALL_ACCEPTED, async (sess: any) => {
if (isCall || ready) return;
session.current = sess;
const sipSession = Wazo.Phone.getCurrentSipSession();
if (session.current?.cameraEnabled) {
const { peerConnection } = sipSession.sessionDescriptionHandler;
const locStreams = peerConnection.getLocalStreams();
const remStreams = peerConnection.getRemoteStreams();
const anyTrack = (stream: any) => !!stream.getVideoTracks().length;
local.current = locStreams.find(anyTrack);
remote.current = remStreams.find(anyTrack);
if (!isIOS) {
RNCallKeep.backToForeground();
}
await inCallManager.start({ media: 'video', auto: true });
} else if (session.current) {
await inCallManager.start({ media: 'audio', auto: true });
}
await sipSession.sendReinvite();
dispatch({ ready: true });
});
{remote.current && isCall && ready && (
<View style={{ borderColor: 'red', borderWidth: 5, flex: 1 }}>
<RTCView
objectFit='cover'
streamURL={remote.current?.toURL()}
style={styles.remoteVideo}
zOrder={15}
/>
</View>
)}