Audio/video out of sync after switch camera

I had the same problem, tried a lot if things and came up with an easy and convenient solution which works without any glitch.

enter image description here

The problem is, as @daij-djan pointed out, that switching a session input takes a little time and adds a few black frames to the output and then continue sending frames as if it has never stop. As far as I know it is impossible to know how much frames are impacted. The session timecode is not impacted by this delay so we can't use it to ignore some video frames.

enter image description here

Instead of having one session with multiple camera inputs, you can have one session per camera input (+ one for audio if you need it) and one video output. Then you only need to switch this output between the sessions.

enter image description here

As a result you will have no desynchronization and no ugly hack to do. The memory impact is very limited in my tests and I didn't noticed any performance impact. My theory is that a session isn't active until it has an output attached.

Switching outputs can be done like this:

fromSession.beginConfiguration()
fromSession.removeOutput(videoOutput)
fromSession.commitConfiguration()

toSession.beginConfiguration()
if toSession.canAddOutput(videoOutput) { toSession.addOutput(videoOutput) }
toSession.commitConfiguration()