| 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 acquire_ffmpeg_lock():
- """获取FFmpeg全局锁"""
- _ffmpeg_lock.acquire()
- def release_ffmpeg_lock():
- """释放FFmpeg全局锁"""
- _ffmpeg_lock.release()
- class FFLockContext:
- """with语句用法: with ff_lock(): cap.read()"""
- def __enter__(self):
- _ffmpeg_lock.acquire()
- return self
- def __exit__(self, *args):
- _ffmpeg_lock.release()
- # 便捷别名
- ff_lock = FFLockContext
|