| 12345678910111213141516171819202122232425262728293031323334353637 |
- """
- 全局视频捕获锁
- 防止多个VideoCapture并发read()导致FFmpeg async_lock崩溃
- FFmpeg内部使用共享线程池解码,多个VideoCapture.read()并发调用
- 会触发 pthread_frame.c:167 的 async_lock 断言失败导致进程崩溃。
- 此模块提供全局锁,序列化所有read()调用。
- """
- import threading
- # 全局锁:所有VideoCapture.read()必须持有此锁
- _ffmpeg_lock = threading.Lock()
- def safe_read(cap) -> tuple:
- """
- 线程安全的VideoCapture.read()
- 持有全局锁调用cap.read(),防止FFmpeg并发崩溃。
- 如果发生异常,返回(False, None)而非让异常传播导致线程退出。
- """
- with _ffmpeg_lock:
- try:
- return cap.read()
- except Exception:
- return (False, None)
- def safe_is_opened(cap) -> bool:
- """
- 线程安全的VideoCapture.isOpened()检查
- """
- with _ffmpeg_lock:
- try:
- return cap.isOpened()
- except Exception:
- return False
|