二维码位置配置

This commit is contained in:
ywb
2026-05-21 01:54:13 +08:00
parent a5aaddc4fc
commit 56729c23e8
2 changed files with 46 additions and 27 deletions
+31 -22
View File
@@ -35,39 +35,47 @@ ARM_CAMERA_INDEX = 0 # 机械臂端摄像头设备号
_ffmpeg_proc = None
def _ensure_ffmpeg():
"""确保 ffmpeg 进程在运行,自动重启崩溃的进程"""
global _ffmpeg_proc
if _ffmpeg_proc is None or _ffmpeg_proc.poll() is not None:
logger.info(f"启动 ffmpeg 视频流 (Video{ARM_CAMERA_INDEX})")
_ffmpeg_proc = subprocess.Popen(
[
"ffmpeg",
"-f", "v4l2",
"-input_format", "mjpeg",
"-i", f"/dev/video{ARM_CAMERA_INDEX}",
"-vf", "rotate=PI",
"-q:v", "8",
"-f", "mjpeg",
"-"
],
stdout=subprocess.PIPE,
stderr=subprocess.DEVNULL,
)
time.sleep(2.0) # 等待 ffmpeg 初始化完成(设备冷启动可能需要更久)
@arm_video_app.route("/api/camera/preview")
def arm_camera_preview():
"""机械臂摄像头 MJPEG 流 (ffmpeg)"""
global _ffmpeg_proc
_ensure_ffmpeg()
def generate():
global _ffmpeg_proc
# 启动 ffmpeg 进程(如果尚未运行)
if _ffmpeg_proc is None or _ffmpeg_proc.poll() is not None:
logger.info(f"启动 ffmpeg 视频流 (Video{ARM_CAMERA_INDEX})")
_ffmpeg_proc = subprocess.Popen(
[
"ffmpeg",
"-f", "v4l2",
"-input_format", "mjpeg",
"-i", f"/dev/video{ARM_CAMERA_INDEX}",
"-vf", "rotate=PI",
"-q:v", "8",
"-f", "mjpeg",
"-"
],
stdout=subprocess.PIPE,
stderr=subprocess.DEVNULL,
)
time.sleep(0.5) # 等待 ffmpeg 初始化
try:
while True:
if _ffmpeg_proc is None or _ffmpeg_proc.poll() is not None:
break
_ensure_ffmpeg()
jpeg = _ffmpeg_proc.stdout.read(65536)
if not jpeg:
break
# ffmpeg 无数据输出,重启它
logger.warning("ffmpeg stdout 空,重启")
_ffmpeg_proc.terminate()
_ffmpeg_proc = None
_ensure_ffmpeg()
continue
yield (b"--frame\r\nContent-Type: image/jpeg\r\n\r\n" + jpeg + b"\r\n")
except Exception as e:
logger.error(f"视频流异常: {e}")
@@ -92,6 +100,7 @@ def arm_camera_restart():
if _ffmpeg_proc:
_ffmpeg_proc.terminate()
_ffmpeg_proc = None
_ensure_ffmpeg()
return jsonify({"ok": True})