p.lavrenko
New Member
TL;DR
Setup
MacBook Pro M1 Pro, macOS 27.0.1, OBS 32.2.2. A single Thunderbolt cable goes to a Lenovo ThinkVision P40w-20 monitor, which has a built-in USB hub. Two cameras are plugged into the monitor:
Diagnosis 1: USB errors in the kernel log
While OBS was running, the kernel logged USB transaction errors on the camera's video endpoint, about 2 per minute (239 in one 70-minute session). The MX Brio had none. To check it yourself:
Lines look like:
(In zsh, plain
Diagnosis 2: what format the camera actually streams
macOS's camera service (UVCAssistant) logs the format and the USB bandwidth mode each time a stream starts:
With OBS's default choice I got:
Why it happens: macOS hides MJPEG
You may have read that macOS only offers uncompressed streams from Logitech cameras. That isn't quite true. MJPEG is still there, but macOS decodes it itself and presents it as a second NV12 (420v) format at the same resolution. In OBS's format list you get two near-identical lines:
The only visible difference is the extra 60/90 fps; raw 720p can't do 90 fps over this link. 1920x1080 is the same, where the entry that offers 60 FPS is the compressed one.
The fix
After the change the UVCAssistant log shows
Result
Before: about 2 transaction errors per minute (around 20 per 10 minutes) and visible blinks. After: 0 errors in 10 minutes, no blinking. Same camera, cable, port and hub.
Possibly related threads
- Symptom: a Logitech Brio 4K picture in OBS blinks every few minutes on macOS.
- Cause: OBS pulls the uncompressed stream, which takes the maximum USB bandwidth slot, and the USB hub in my monitor drops packets under that load.
- Fix: in the camera source, untick "Use preset", pick the 1280x720 … 30, 60, 90 FPS - NV12 (420v) entry and set 60 FPS. That entry is actually MJPEG.
Setup
MacBook Pro M1 Pro, macOS 27.0.1, OBS 32.2.2. A single Thunderbolt cable goes to a Lenovo ThinkVision P40w-20 monitor, which has a built-in USB hub. Two cameras are plugged into the monitor:
- Logitech BRIO 4K Stream Edition (rear USB-A). Inside the monitor it sits behind two Genesys Logic hub chips.
- Logitech MX Brio (rear USB-C / Thunderbolt). It is attached directly to the monitor's Thunderbolt controller.
Diagnosis 1: USB errors in the kernel log
While OBS was running, the kernel logged USB transaction errors on the camera's video endpoint, about 2 per minute (239 in one 70-minute session). The MX Brio had none. To check it yourself:
Code:
/usr/bin/log show --last 30m --style compact --predicate 'process == "kernel" AND eventMessage CONTAINS "transaction error"'
Code:
AppleUSBXHCIIsochronousRequest: AppleUSBIORequest::complete: device 13 (BRIO 4K Stream Edition@00221200) endpoint 0x81: status 0xe00002ed (transaction error)
log is a shell builtin; use /usr/bin/log.)Diagnosis 2: what format the camera actually streams
macOS's camera service (UVCAssistant) logs the format and the USB bandwidth mode each time a stream starts:
Code:
/usr/bin/log show --last 10m --style compact --info --debug --predicate 'process == "UVCAssistant" AND (eventMessage CONTAINS "Start Stream format" OR eventMessage CONTAINS "compressed:" OR eventMessage CONTAINS "Stream Alternate Setting")'
Code:
Start Stream format UVCDeviceStreamFormat:[1280 * 720 (YUV420_420v)] ... frameInterval 333333
alignedBytesPerRow: 1280 sourceBytesPerRow: 1280 compressed: 0
Stream Alternate Setting 7
compressed: 0 means raw video, and alternate setting 7 is the camera's largest isochronous slot (6144 bytes every 125 µs). Isochronous transfers are never retried, so whenever a hub chip misses a packet, part of a frame is gone and the frame is dropped or broken. That is the blink.Why it happens: macOS hides MJPEG
You may have read that macOS only offers uncompressed streams from Logitech cameras. That isn't quite true. MJPEG is still there, but macOS decodes it itself and presents it as a second NV12 (420v) format at the same resolution. In OBS's format list you get two near-identical lines:
Code:
1280x720 (16:9) - 5, 7.50, 10, 15, 20, 24, 30 FPS - CS 709 - NV12 (420v) <- raw
1280x720 (16:9) - 5, 7.50, 10, 15, 20, 24, 30, 60, 90 FPS - CS 709 - NV12 (420v) <- MJPEG
The fix
- Open the camera source properties and untick Use preset.
- Choose 1280x720 (16:9) - 5, 7.50, 10, 15, 20, 24, 30, 60, 90 FPS - CS 709 - NV12 (420v).
- Set the frame rate to 60. My OBS canvas stays at 30 fps; OBS just drops every other frame.
compressed: 0. OBS apparently resolves resolution + pixel format + frame rate to the first matching format, which is the raw twin. Only 60 fps is unique to the MJPEG entry. That's my inference from the behaviour; I haven't checked it in OBS's code.After the change the UVCAssistant log shows
compressed: 1.Result
Before: about 2 transaction errors per minute (around 20 per 10 minutes) and visible blinks. After: 0 errors in 10 minutes, no blinking. Same camera, cable, port and hub.
Possibly related threads
- Flickering on video capture with new OBS update: https://obsproject.com/forum/threads/flickering-on-video-capture-with-new-obs-update.166423
- Logitech Brio 4k (again): lag :( : https://obsproject.com/forum/threads/logitech-brio-4k-again-lag.162384/