57 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import cv2
 | 
						|
import subprocess
 | 
						|
import re
 | 
						|
from logger_config import logger
 | 
						|
 | 
						|
 | 
						|
def get_camera_names():
 | 
						|
    """Gets a list of available camera names using ffmpeg (macOS only)."""
 | 
						|
    try:
 | 
						|
        result = subprocess.run(
 | 
						|
            ["ffmpeg", "-f", "avfoundation", "-list_devices", "true", "-i", ""],
 | 
						|
            stderr=subprocess.PIPE,
 | 
						|
            stdout=subprocess.PIPE,
 | 
						|
            text=True
 | 
						|
        )
 | 
						|
        output = result.stderr  # ffmpeg prints device list to stderr
 | 
						|
 | 
						|
        # Extract camera names from ffmpeg output
 | 
						|
        camera_lines = re.findall(r'\[AVFoundation input device @ .*?] \".*\"', output)
 | 
						|
        cameras = [re.search(r'"(.*?)"', line).group(1) for line in camera_lines]
 | 
						|
        return cameras
 | 
						|
    except Exception as e:
 | 
						|
        logger.error(f"❌ Error getting camera names: {e}")
 | 
						|
        return []
 | 
						|
 | 
						|
 | 
						|
def list_available_cameras():
 | 
						|
    """Lists available camera indexes and their names, with a preview."""
 | 
						|
    logger.info("🔍 Scanning for available cameras...")
 | 
						|
 | 
						|
    camera_names = get_camera_names()
 | 
						|
    found_cameras = []
 | 
						|
 | 
						|
    for i in range(10):  # Check the first 10 indexes
 | 
						|
        cap = cv2.VideoCapture(i, cv2.CAP_AVFOUNDATION)
 | 
						|
        if cap.isOpened():
 | 
						|
            name = camera_names[i] if i < len(camera_names) else f"Unknown Camera {i}"
 | 
						|
            logger.info(f"✅ Camera {i}: {name}")
 | 
						|
            found_cameras.append((i, name))
 | 
						|
 | 
						|
            ret, frame = cap.read()
 | 
						|
            if ret:
 | 
						|
                cv2.imshow(f"Camera {i}: {name}", frame)
 | 
						|
                cv2.waitKey(1000)  # Show preview for 1 second
 | 
						|
                cv2.destroyAllWindows()
 | 
						|
            cap.release()
 | 
						|
        else:
 | 
						|
            logger.warning(f"❌ No camera found at index {i}")
 | 
						|
 | 
						|
    if found_cameras:
 | 
						|
        logger.info("\n🎥 Available Cameras:")
 | 
						|
        for index, name in found_cameras:
 | 
						|
            logger.info(f"  {index}: {name}")
 | 
						|
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    list_available_cameras()
 |