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

如何在Nginx RTMP的preview应用块中获取stream_key参数?

解决RTMP应用中获取URL查询参数的问题

nginx的RTMP模块默认不会解析推流URL中的查询参数,因此你尝试的$arg_stream_key、$stream_key这类变量在RTMP应用块中无法直接获取到值。以下提供两种可行的解决方案:

方案一:修改推流URL格式,将stream_key嵌入流名路径

无需额外模块,直接通过分割流名参数来获取stream_key:

  1. 修改推流URL为:rtmp://localhost:1935/preview/somename/somekey(把原查询参数stream_key=somekey改成流名的一部分,用斜杠分隔)
  2. 更新preview应用的配置:
application preview {
    live on;
    hls on;
    meta copy;

    # 分割流名,提取出stream_name和stream_key
    set $stream_name "";
    set $stream_key "";
    split $name / $stream_name $stream_key;

    # 转推时使用提取到的stream_key
    exec ffmpeg -re -i rtmp://localhost:1935/preview/$name -c copy -f flv rtmp://localhost:1935/cloudflare_stream/$stream_key;
}

方案二:使用on_publish钩子+共享内存存储参数

如果必须保留原URL的查询参数格式,需要借助nginx的HTTP模块和共享内存来传递参数(需确保nginx安装了ngx_http_set_misc_module模块,或使用OpenResty):

  1. 在http块中配置共享内存和内部钩子接口:
http {
    # 定义共享内存区域,用于存储流名与stream_key的映射
    shared_memory rtmp_stream_keys 1m;

    server {
        listen 80;
        server_name localhost;

        # 内部接口,处理RTMP推流的publish钩子请求
        location /rtmp_publish_hook {
            internal;
            # 将stream_key存入共享内存,以流名为键
            set_shm_set $rtmp_stream_keys $arg_name $arg_stream_key;
            return 200;
        }
    }
}
  1. 更新preview应用的配置,添加钩子并读取共享内存中的参数:
application preview {
    live on;
    hls on;
    meta copy;

    # 触发publish钩子,传递流名和查询参数到内部HTTP接口
    on_publish http://localhost/rtmp_publish_hook?name=$name&stream_key=$arg_stream_key;

    # 从共享内存读取对应流名的stream_key,用于转推
    exec ffmpeg -re -i rtmp://localhost:1935/preview/$name -c copy -f flv rtmp://localhost:1935/cloudflare_stream/$rtmp_stream_keys_$name;
}

两种方案中,方案一无需额外依赖,配置更简洁;方案二更贴合你原本的URL格式需求,但需要额外模块支持。

内容的提问来源于stack exchange,提问作者Skauen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 03:57:37