如何在Nginx RTMP的preview应用块中获取stream_key参数?
解决RTMP应用中获取URL查询参数的问题
nginx的RTMP模块默认不会解析推流URL中的查询参数,因此你尝试的$arg_stream_key、$stream_key这类变量在RTMP应用块中无法直接获取到值。以下提供两种可行的解决方案:
方案一:修改推流URL格式,将stream_key嵌入流名路径
无需额外模块,直接通过分割流名参数来获取stream_key:
- 修改推流URL为:
rtmp://localhost:1935/preview/somename/somekey(把原查询参数stream_key=somekey改成流名的一部分,用斜杠分隔) - 更新
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):
- 在
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; } } }
- 更新
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
相关产品推荐
相关产品推荐

