video_lock.py 1007 B

12345678910111213141516171819202122232425262728293031323334353637
  1. """
  2. 全局视频捕获锁
  3. 防止多个VideoCapture并发read()导致FFmpeg async_lock崩溃
  4. FFmpeg内部使用共享线程池解码,多个VideoCapture.read()并发调用
  5. 会触发 pthread_frame.c:167 的 async_lock 断言失败导致进程崩溃。
  6. 此模块提供全局锁,序列化所有read()调用。
  7. """
  8. import threading
  9. # 全局锁:所有VideoCapture.read()必须持有此锁
  10. _ffmpeg_lock = threading.Lock()
  11. def safe_read(cap) -> tuple:
  12. """
  13. 线程安全的VideoCapture.read()
  14. 持有全局锁调用cap.read(),防止FFmpeg并发崩溃。
  15. 如果发生异常,返回(False, None)而非让异常传播导致线程退出。
  16. """
  17. with _ffmpeg_lock:
  18. try:
  19. return cap.read()
  20. except Exception:
  21. return (False, None)
  22. def safe_is_opened(cap) -> bool:
  23. """
  24. 线程安全的VideoCapture.isOpened()检查
  25. """
  26. with _ffmpeg_lock:
  27. try:
  28. return cap.isOpened()
  29. except Exception:
  30. return False