二维码位置配置
This commit is contained in:
+31
-22
@@ -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})
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user