Nginx转发内网Flv视频流

1、环境说明

Docker Nginx:1.21.5

实现Nginx ssl转发内网flv视频流

2、配置nginx.conf

注意:使用https不能添加跨域参数,把跨域配置到对应得location

http {
    upstream live {
        server 10.10.10.10:8300;
        keepalive 64;
    }
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

    server {
        listen       80;
        listen       443   ssl;
        server_name  www.wielun.com;
        ssl_certificate xxxx_server.crt;
        ssl_certificate_key xxx_server.key;
        
        location /wielun/ {
                    proxy_pass     http://live/;
                    proxy_set_header Host $host:$server_port;
                    proxy_http_version 1.1;
                    proxy_set_header Upgrade $http_upgrade;
                    proxy_set_header Connection "upgrade";
        }
    }
}
# docker restart nginx

3、测试

https://www.wielun.com/wielun/test/test001.live.flv

在这里插入图片描述

参考文章:https://blog.csdn.net/qq_41814311/article/details/123638530

<think>我们正在处理一个关于SRS(Simple Realtime Server)流媒体服务器的问题:用户希望通过WebSocket转发SRS拉取的RTSP流。我们需要参考提供的引用内容,特别是引用[1]和引用[2],来构建解决方案。 引用[1]提到SRS的httpx-static模块统一处理控制面请求,包括WebRTC推流流程,其中客户端通过HTTP请求和WebSocket连接进行协商。引用[2]则给出了一个拉取RTSP流的API示例。 用户的需求可以分解为两个主要步骤: 1. 使用SRS从RTSP源(如摄像头)拉取视频流。 2. 将拉取的视频流通过WebSocket转发给客户端。 根据引用[2],我们可以使用SRS的API来拉取RTSP流。例如,向SRS服务器发送一个HTTP GET请求来触发拉流: ``` http://127.0.0.1:18080/rtsp/api/pull?target=rtsp://username:[email protected]:554/h264/ch01/main/av_stream&streamPath=live/badao&save=0 ``` 这个请求会指示SRS从指定的RTSP源拉取流,并发布到`live/badao`这个流路径上。 接下来,我们需要通过WebSocket将这个流转发给客户端。在SRS中,通常使用HTTP-FLV或WebRTC等方式播放流,但用户要求使用WebSocket转发。 SRS本身支持WebSocket传输,例如可以通过WebSocket传输FLV格式的流。具体来说,SRS支持WebSocket-FLV,即通过WebSocket传输FLV格式的流数据。 因此,我们可以这样实现: 1. 使用SRS的RTSP拉流功能将RTSP流拉取到SRS,并发布为一个指定的流(例如`live/badao`)。 2. 客户端通过WebSocket连接到SRS的WebSocket-FLV地址来订阅这个流。 SRS的WebSocket-FLV的播放URL格式为:`ws://服务器IP:端口/应用名/流名.flv`,例如: ``` ws://127.0.0.1:8080/live/badao.flv ``` 注意:SRS默认的HTTP端口是8080(用于WebSocket)和RTMP端口是1935。在配置拉流时使用的API端口是18080(管理端口)。 因此,步骤总结如下: ### 步骤1: 配置SRS并启动 确保SRS配置文件中启用了RTSP拉流和HTTP服务器(包括WebSocket支持)。参考配置如下(在`conf/srs.conf`中): ```nginx listen 1935; max_connections 1000; daemon off; srs_log_tank console; http_server { enabled on; listen 8080; dir ./objs/nginx/html; } http_api { enabled on; listen 1985; } rtc_server { enabled on; listen 8000; # UDP端口 candidate $CANDIDATE; # 设置为主机的公网IP或内网IP } rtsp { enabled on; listen 554; # RTSP监听端口 } # 拉流配置:通过HTTP API触发 ``` ### 步骤2: 启动SRS 启动SRS服务器。 ### 步骤3: 通过API拉取RTSP流 使用HTTP GET请求触发SRS拉取RTSP流: ``` http://127.0.0.1:1985/rtsp/pull?rtsp_url=rtsp://username:password@摄像头IP:554/路径&stream=live/badao ``` 注意:引用[2]中的API路径是`/rtsp/api/pull`,但根据SRS的文档,我们通常使用`/rtsp/pull`(在1985端口)。请根据实际SRS版本调整。 ### 步骤4: 客户端通过WebSocket连接接收流 客户端使用WebSocket连接到SRS的WebSocket-FLV地址: ``` ws://SRS服务器IP:8080/live/badao.flv ``` 然后,客户端接收到的数据是FLV格式的流,可以通过FLV解码器进行播放。 ### 注意事项 - 确保SRS编译时启用了RTSP模块和WebSocket支持。 - 如果需要在网页中播放,可以使用flv.js库,它支持通过WebSocket传输FLV流。 ### 代码示例(客户端) 在网页中,可以使用以下代码通过WebSocket播放FLV流: ```html <script src="https://cdn.bootcss.com/flv.js/1.5.0/flv.min.js"></script> <video id="videoElement" controls autoplay></video> <script> if (flvjs.isSupported()) { var videoElement = document.getElementById('videoElement'); var flvPlayer = flvjs.createPlayer({ type: 'flv', url: 'ws://localhost:8080/live/badao.flv', isLive: true }); flvPlayer.attachMediaElement(videoElement); flvPlayer.load(); flvPlayer.play(); } </script> ``` ### 引用说明 我们参考了SRS的API和配置方式[^1][^2]。 §§相关问题§§ 1. SRS拉取RTSP流失败的可能原因有哪些? 2. 如何配置SRS以支持WebSocket-FLV? 3. 在WebSocket传输视频流时,如何保证低延迟?</think>### SRS RTSP流拉取并通过WebSocket转发的实现方法 要实现通过WebSocket转发SRS拉取的RTSP流,需要结合SRS的**RTSP拉流功能**和**WebSocket传输能力**。以下是具体步骤: #### 1. **配置SRS拉取RTSP流** 使用SRS的HTTP API触发RTSP拉流操作,将摄像头RTSP流拉取到SRS服务器: ```bash # 示例:向SRS发送拉流请求 curl "http://127.0.0.1:18080/rtsp/api/pull?target=rtsp://admin:[email protected]:554/stream&streamPath=live/websocket_stream&save=0" ``` - `target`: RTSP源地址(需替换为实际摄像头地址) - `streamPath`: 自定义流路径(如`live/websocket_stream`) - `save=0`: 不保存为本地文件[^2] #### 2. **配置WebSocket转发** SRS支持通过WebSocket传输FLV格式的流。在SRS配置文件(`srs.conf`)中添加: ```nginx http_server { enabled on; listen 8080; # 启用WebSocket支持 ws { enabled on; mount /live; # WebSocket访问路径 flv { enabled on; # 允许传输FLV流 } } } ``` #### 3. **客户端通过WebSocket接收流** 客户端使用WebSocket连接到SRS的指定路径: ```javascript // 示例:WebSocket客户端代码 const ws = new WebSocket("ws://your-srs-ip:8080/live/websocket_stream.flv"); ws.binaryType = "arraybuffer"; ws.onmessage = (event) => { const flvData = new Uint8Array(event.data); // 将FLV数据传递给播放器(如flv.js) flvPlayer.feed(flvData); }; ``` - 流地址格式:`ws://[SRS_IP]:[端口]/[流路径].flv` #### 4. **完整流程** 1. SRS通过API拉取RTSP流 → 2. 流转换为FLV格式 → 3. WebSocket监听端口转发数据 → 4. 客户端通过WebSocket接收并播放[^1][^3] #### 关键注意事项 - **SRS版本要求**:需使用SRS v4.0+(支持完整的WebSocket-FLV功能) - **协议转换**:RTSP流会被SRS自动转换为FLV格式通过WebSocket传输 - **低延迟优化**:在SRS配置中调整`min_latency on;`可减少传输延迟 - **安全加固**:生产环境应启用WSS(WebSocket Secure)和鉴权[^1] #### 验证方法 ```bash # 检查SRS拉流状态 curl http://127.0.0.1:1985/api/v1/streams/ # 应返回包含"live/websocket_stream"的流信息 ``` > 此方案利用SRS内置的协议转换能力,避免了额外开发中转服务。对于高并发场景,建议开启SRS集群模式[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wielun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值