The code snippet that broke me:
cap = cv2.VideoCapture(0 + cv2.CAP_DSHOW) #dshow only required for usb CC, not webcam capture. idk why! cap.set(cv2.CAP_PROP_FPS, 30.0) #if you'd like cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter.fourcc('m','j','p','g')) #yep, both upper and lower case cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter.fourcc('M','J','P','G'))
The upper/lower case fix took 4 months to stumble upon. Praise be random github comments buried in vaguely related issues!
Video Device Dropdown
check out pygrabber for windows https://stackoverflow.com/a/70770221