You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Selenium Moon动态创建的浏览器Pod通过FFmpeg推流至RTMP?

在Minikube中为Aerokube Moon实现浏览器会话RTMP推流的解决方案

集群现状

$ kubectl get all -n my-namespace
NAME                                    READY   STATUS    RESTARTS   AGE
pod/minio-5b85cc6cd6-nznwl              1/1     Running   1 (48m ago)   2d8h
pod/moon-7db8b9c76f-8jzzm               4/4     Running   0             34m
pod/moon-7db8b9c76f-kp78j               4/4     Running   0             34m

NAME                     TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                 AGE
service/minio            NodePort    10.99.231.25     <none>        9000:31147/TCP,9001:31125/TCP          2d8h
service/moon             NodePort    10.100.244.255   <none>        4444:30683/TCP,9090:32243/TCP,8080:32571/TCP   34m

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/minio              1/1     1            1           2d8h
deployment.apps/moon               2/2     2            2           34m

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/minio-5b85cc6cd6              1         1         1       2d8h
replicaset.apps/moon-7db8b9c76f               2         2         2       34m

核心挑战

  • Moon在测试运行时动态创建浏览器Pod,无法提前配置推流逻辑
  • 需要用FFmpeg捕获浏览器画面并推流到指定RTMP端点
  • Moon由Helm安装,需通过Helm配置实现功能注入

可行解决方案思路

1. 自定义浏览器镜像,内置FFmpeg与推流逻辑

Moon支持指定自定义浏览器镜像,这是最直接的方式:

  • 基于官方Moon浏览器镜像(比如aerokube/moon-chrome)构建新镜像,安装FFmpeg
  • 在镜像中添加启动脚本:启动浏览器后,立即启动FFmpeg捕获X11显示画面,推流到RTMP端点
    示例启动脚本片段:
    # 启动浏览器(保持原有Moon启动逻辑)
    /path/to/original/start-browser.sh &
    # 等待浏览器启动完成
    sleep 5
    # 用FFmpeg捕获X11显示 :0 并推流到RTMP
    ffmpeg -f x11grab -r 25 -s 1920x1080 -i :0 -c:v libx264 -preset ultrafast -tune zerolatency -f flv rtmp://your-rtmp-endpoint/live/stream-key
    
  • 修改Helm values.yaml,指定自定义镜像:
    browsers:
      chrome:
        image: your-registry/moon-chrome-ffmpeg:latest
        version: ""
    

2. 通过Moon的Sidecar注入机制添加FFmpeg容器

Moon的Helm chart支持为浏览器Pod注入sidecar容器,无需修改基础镜像:

  • 在Helm values.yaml中配置sidecar,使用FFmpeg镜像,共享浏览器Pod的X11套接字:
    browserPod:
      sidecars:
        - name: ffmpeg-publisher
          image: jrottenberg/ffmpeg:4.4-alpine
          command: ["sh", "-c"]
          args:
            - |
              sleep 10
              ffmpeg -f x11grab -r 25 -s 1920x1080 -i /tmp/.X11-unix/X0 -c:v libx264 -preset ultrafast -tune zerolatency -f flv rtmp://your-rtmp-endpoint/live/$(POD_NAME)
          volumeMounts:
            - name: x11-socket
              mountPath: /tmp/.X11-unix
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
    
    这里通过POD_NAME环境变量为每个浏览器会话生成唯一流密钥,避免冲突。

3. 动态捕获与推流的集群级方案

如果不想修改Moon配置,可以用Kubernetes的动态准入控制器(比如MutatingWebhook)自动为所有Moon浏览器Pod添加FFmpeg sidecar:

  • 编写一个简单的Webhook,监听Pod创建事件,当Pod属于Moon浏览器(标签匹配app=moon-browser)时,注入FFmpeg sidecar容器
  • 该方案适合多环境复用,无需修改Helm配置,但需要额外部署Webhook组件

关键注意事项

  • RTMP端点可达性:确保浏览器Pod能访问RTMP服务器(如果在集群外部,需确认网络策略、NodePort/Loadbalancer配置)
  • 资源占用:FFmpeg推流会消耗CPU和带宽,需调整浏览器Pod的资源请求/限制:
    browserPod:
      resources:
        requests:
          cpu: "1"
          memory: "2Gi"
        limits:
          cpu: "2"
          memory: "4Gi"
    
  • 画面捕获参数:根据测试需求调整FFmpeg的分辨率、帧率、编码参数,平衡画质和延迟

内容的提问来源于stack exchange,提问作者Ahmed Seddik Bouchiba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:58:11